2010-08-27 77 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