2010-08-27 104 views
0

快速的問題,希望我只是想念一些簡單的東西。好的,我有一個類持有指向另一個的指針; MainMenuClass和NormalGameClass。 MainMenuClass內部我做了以下。現在iPhone - 保留計數 - 保留數量沒有明顯的原因

m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]]; 
m_NormalGame.delegate = self; 
[self presentModalViewController:m_NormalGame animated:YES]; 

,我第一次注意到每當NormalGameClass'的dealloc函數沒有被調用,所以我做了一些retainCount電話,由於某種原因,一旦它做它的方式返回到MainMenu的發佈功能,它的保留計數問題是6.進一步挖掘讓我非常困惑。在NormalGameClass中的viewDidLoad之後的第一行是[self retainCount]。4.任何人都知道這裏可能會發生什麼?我一次只調用NormalGameClass的alloc,但它被保留到6?奇怪的是,從來沒有過去。感謝您的任何見解。

更新:擺弄東西,發現這是尷尬的。在MainMenuClass,這裏是我如何擺脫NormalGame。

[self dismissModalViewControllerAnimated:NO]; 
m_NormalGame.delegate = nil; 
[m_NormalGame release]; 

現在,在這個設置下,NormalGame的dealloc永遠不會被調用。但是,如果我在上面發佈的那個之後立即調用[m_NormalGame發佈],它會爲NormalGame調用dealloc ...兩次。 = /讓我感到困惑。

+0

這些是您自己的課程還是來自其他圖書館? – 2010-08-27 21:04:57

+0

這些是剛剛重命名的UIViewControllers。 – Midnight 2010-08-27 21:08:00

回答

0

presentModalViewController保留傳遞的視圖控制器,因此如果您不自動釋放視圖控制器,則需要釋放視圖控制器。在這種情況下,你需要釋放m_NormalGame。

m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]]; 
m_NormalGame.delegate = self; 
[self presentModalViewController:m_NormalGame animated:YES]; 
**[m_NormalGame release];** 
+0

呃!非常感謝你。你是救生員。 – Midnight 2010-08-28 01:29:36

+0

沒問題,很高興我能幫忙! – bstahlhood 2010-08-30 02:42:54

0

我會想象,-dismissModalViewControllerAnimated:調用不釋放視圖控制器,直到解散完成。你確實需要平衡控制器的初始-alloc/-init和-release,但是你不應該期望立即調用-dealloc方法。如果對象是自動釋放的,它可能實際上在運行循環的下一次迭代期間被調用。

你是說沒有兩個調用釋放你的dealloc沒有被調用,或者它是不是立即調用?

此外,儘量不要檢查保留計數,因爲這隻會導致混淆和頭痛。只需正確地按照memory management rules

+0

我在NormalGame的dealloc方法中放置了一個斷點。只有一個釋放調用,該斷點永遠不會觸發。所以dealloc基本上不會被調用。 – Midnight 2010-08-27 22:00:32