2012-08-17 55 views
0

我需要一些幫助,在..im不使用ARC ..take看看這個簡單的代碼從我的主要代表控制器的Xcode釋放控制器:無法釋放的ViewController

LoginViewController *login = [[LoginViewController alloc] init]; 
[window addSubview:login.view]; 
[window makeKeyAndVisible]; 
[login release]; // code runs if i comment out this line 

如果我註釋掉程序運行的最後一行。 該程序崩潰的最後一行...我把殭屍,這裏是結果: 2012-08-17 09:43:02.193 dialer [238:707] * - [LoginViewController performSelector:withObject:withObject :]:發送到釋放實例的消息0x186360

我該如何跟蹤這個問題,爲什麼這個問題甚至因爲即時分配和釋放而發生抖動。它是否與保留等有關

回答

1

登錄控制器添加爲子視圖然後釋放,但addSubview方法不保留控制器(只有controller.view),所以它不能繼續使用。

你必須釋放它,否則你將會泄漏,解決方案是在你的類中創建一個屬性/ ivar,併爲其分配視圖控制器(而不是局部變量),然後在dealloc中釋放它。

我認爲你缺少的一點是[登錄發佈]語句有效地減少了你的loginViewController的保留數到零,並且對象丟失/清理,這不是你想要的,因爲你仍然需要它只要你的子視圖被顯示。所以你的父對象(主控制器,如果我正確理解你的例子)創建loginController,將loginView作爲子視圖(通過執行addSubview調用保留),然後釋放控制器,但是你仍然需要它來處理登錄視圖!所以解決方法是在主控制器中保留一個引用,以便根據需要保留它(直到你刪除loginView,或者主控制器被取消分配)

+0

嗨Jeroen,如果是這樣的話,那麼如何才能我釋放控制器,我只分配了兩行以上?喲說,addSubview方法爲我釋放這個對象? – j2emanue 2012-08-17 14:00:00

+0

我編輯了答案一點:) – Asciiom 2012-08-17 14:01:59

+0

謝謝Jeroen,但我錯過了什麼嗎?我沒有分配視圖控制器嗎?我負責釋放它。對我來說,我不在乎,如果addSubView保留或不,因爲我有內存分配的所有權(不要我?),所以我應該是一個釋放它。無論如何,如果我確實創建了一個屬性,我應該給它的屬性應該是什麼(非原子,保留) – j2emanue 2012-08-17 14:11:07