2008-10-30 47 views
6

所以是的,我是一個在這個瘋狂的iPhone世界中的Java人。當談到記憶管理時,我對自己在做什麼沒有很好的想法。如何通過導航控制器管理UIViewControllers?

我有一個使用導航控制器,當它的時間去到下一個視圖我有一些代碼,看起來像這樣的應用程序:

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                    bundle:[NSBundle mainBundle]; 
[[self navigationController] pushViewController:myController animated:YES]; 

現在根據蘋果的內存管理

基本規則

如果使用名稱以「黃金」或「新」,或包含「複製」(例如,allocnewObject,或mutableCopy),或者如果您發送的方法創建你需要一個對象的所有權它是一個retain消息。您有責任放棄使用releaseautorelease所擁有的物品的所有權。任何其他時間你收到一個對象,你不能釋放它。

對我來說,這意味着我應該釋放myController,或給它一個autorelease消息。但是,每當我嘗試這樣做的時候,我的應用程序在我將視圖從堆棧中彈出並彈出時就會崩潰。

這聽起來沒有什麼味道,但在運行儀器時聲稱我沒有任何內存泄漏。

所以我我的問題是

  1. 我這樣做對嗎?
  2. 導航控制器是否取得了MyViewController的所有權,解釋了內存泄漏的缺失?
  3. 我應該將myController分配給我的根ViewController中的實例變量嗎?在這種情況下,它會被標記保留,我會在根的dealloc方法

回答

3

@Ben Gottlieb你爲什麼需要在推送之前自動釋放?在對象分配保留數爲1,前或推不影響保留計數,但被應用AFER對象分配/初始化一般自動釋放作爲一個風格問題後自動釋放:

[[[object alloc] init] autorelease]; 

@bpapa,

2)推動時,導航控制器將保留視圖控制器。稍後當此視圖從導航控制器堆棧彈出時,導航控制器將釋放它。

3)除非有明確的理由堅持該觀點,否則不應將其分配給實例變量。一般而言,只要你需要他們,你就希望你的觀點存在。

+0

我只是對比autorelease和release的使用。你可以在之前或之後自動釋放,沒關係,但是如果你釋放,你必須在之後執行。 – 2008-11-26 19:53:31

9

問題是(最有可能)你釋放你的viewController 之前導航控制器有機會要求所有權釋放。這種情況有解決方法有兩種:

  • -release控制器後推到導航控制器
  • -autorelease控制器前推。如果你這樣做,活動的NSAutoreleasePool(你不需要擔心)會在以後的時間裏釋放你的控制器。