2010-01-07 47 views
0

我的代碼的某處需要從主窗口創建多個窗口,每個窗口都以特定的配置運行,但同一控制器對象的所有實例都運行。字典的內存管理/ GCC可能的錯誤解釋?

我還需要保留一個打開的窗口列表,所以無論何時我打開一個窗口,我將它的實例存儲在一個字典中,當窗口關閉時,我發送一個通知給主窗口,該窗口觸發一個方法,然後刪除從字典中的特定窗口。

我通過創建其控制器對象的實例,然後在其上調用[showWindow:self]來創建窗口。然後,我將窗口存儲在字典中並退出該方法。

我的問題是,我既沒有釋放也沒有自動釋放新創建的對象,因爲當窗口從字典中刪除時應該這樣做(對吧?)。如果我在釋放或自動釋放該對象後,將其存儲在字典中後,當我嘗試從字典中刪除該對象時,將會出現各種錯誤。

1)難道這是Xcode中的一個簡單的錯誤,它不會注意到存儲在字典中的實例嗎?

2)無論如何,爲什麼autorelease銷燬我的窗口,如果字典存儲對它的引用?

[更新] 代碼如下

CHPostgreSQLMainController *pgMainController = [[CHPostgreSQLMainController alloc]initWithConnectionSettings:(CHPostgreSQLSettingsModel *)entityFromArray error:&error]; 

// Only display the window if the connection was successful. 
if (pgMainController) { 
    [pgMainController showWindow:self]; 

    // Register the window we've opened on the list of open windows 
    [listOpenWindows setObject:pgMainController forKey:[entityFromArray connectionName]]; 
} else { 
    //call NSAlert 
} 
+0

「我通過創建其控制器對象的實例來創建窗口......」這是您正在討論的NSWindowController嗎?如果是這樣,你用它做什麼? – 2010-01-07 23:00:28

+0

我顯示窗口並將對控制器的引用存儲在字典中。 – ruipacheco 2010-01-08 15:23:13

回答

1

1)難道這是在Xcode 一個簡單的錯誤,沒有注意到該實例存儲在字典 ?

否。保留,發佈和自動釋放發生是因爲您編寫了代碼以使其發生。 Xcode不會將任何此類行爲插入到您的代碼中。

現在,它肯定可能是靜態分析器中的一個錯誤(如您所示)。請發佈更多代碼。

2)無論如何,爲什麼自動釋放 毀了我的窗口,如果字典 被存儲到它的參考?

您是否保留了某個窗口,以便您需要將保留與發佈或autorelease進行權衡?

如果不是,您是過度釋放窗口。

嘗試運行靜態分析器(構建&分析)並修復其標識的任何問題。

在任何情況下,如果您沒有+alloc窗口而您沒有-retain窗口,則不應該釋放它。

+0

對不起,錯誤在Xcode我的意思是它(靜態分析器)標記我的代碼爲可能的內存泄漏,而不是實際的錯誤,這留下了兩件事:如果我忽略Xcode中的警告,我的代碼運行。如果我不修復它,它不會。 – ruipacheco 2010-01-07 20:54:08

+0

啊......是的。它肯定可能是靜態分析器中的一個錯誤。如果你發佈你的代碼,可以進行更好的分析。 – bbum 2010-01-07 22:03:29

0

確保窗口的「關閉時釋放」設置關閉(或者您正在補償)。如果它已打開,則在用戶關閉時自行釋放。

+0

關閉時切換釋放似乎沒有效果,問題完全像以前一樣重複。 – ruipacheco 2010-01-07 23:02:40

+0

不知道爲什麼這是低估,因爲它是一個合理的posible解決方案。 – 2010-01-07 23:14:08

0

確保listOpenWindows(其中確實應該有一個Of)不是nil。也許你忘了創建它還是還沒有創建它。