2010-05-16 29 views
0

我在觀看CS193P斯坦福大學的Itunes課程,並在其中一個演講中給出了一個演示,並且有人說你可以以模態方式呈現視圖控制器,然後釋放它。大致是這樣的(我知道這是不是完美的,但我對我的PC ATM)發佈模式化後的視圖控制器

[self.view presentcontentmodally:myVC] 
[myVC release]; 

然而,這似乎會產生問題。如果我在這兩行之間放置了一個NSLog(@"%d", [myVC retainCount]),那麼它返回2意味着它可以釋放。但是,當我解僱myVC該應用程序崩潰。 NSlog和調試器中的任何內容都不會顯示它停止的位置。

但我使用malloc歷史記錄或某些博客說會有所幫助。並發現它是myVC。

所以我應該釋放myVC?

(也當modalVC已經dissmissed應的應用程序的內存usuage回到modalVC提出過嗎?)

回答

0

是的,你應該把它傳遞給一個模式導航控制器後,釋放你的視圖控制器。只要確保您沒有傳入先前保留的視圖控制器,除非您計劃手動管理其版本。

例如,遵循_myViewController這裏的壽命:

MyViewController *_myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
UINavigationController *_modalNavigationController = [[UINavigationController alloc] initWithRootViewController:_myViewController]; 
[_myViewController release], _myViewController = nil; 
[[self navigationController] presentModalViewController:_modalNavigationController animated:YES]; 
[_modalNavigationController release], _modalNavigationController = nil; 

的模式導航控制器將遞增的_myViewController保留計數,接受基本上它的所有權。

一旦模式導航控制器解僱,你又回到了原來的導航控制器,該模式導航控制器將獲得release消息並反過來release其根視圖控制器(_myViewController)。

此視圖控制器的保留計數將達到零,然後回收內​​存。

0

我剛剛通過一些應用程序進行了檢查,並且我在每次演示後釋放模態視圖控制器,沒有任何問題。這讓我認爲你還不瞭解Cocoa內存管理模型。下面是一個示例:

TweetController *tweetController = [[TweetController alloc] init]; 
tweetController.content = content; 
tweetController.delegate = self; 
[self presentModalViewController:tweetController animated:YES]; 
[tweetController release]; 

請注意,此控制器是使用alloc/init創建的,並且以前未發佈或自動發佈。

另外,請不要依靠保留計數檢查;保留可能來自之前的autoreleased,這將很快消失,導致您看到的那種錯誤。

+0

這與我使用alloc/init創建的控制器在上面添加的位置完全相同。調試告訴我這是myVC,但是當我點擊完成按鈕時(它向第一個VC發送一條消息來解除它),奇怪的是它只在按下完成時崩潰,而不是取消。當點擊完成後,將2個字符串傳回給委託,其中點擊取消僅解散模態VC。 – 2010-05-16 11:04:26

相關問題