【问题标题】:iPhone - Retain Count - Retain count goes up for no apparent reasoniPhone - 保留计数 - 保留计数无明显原因上升
【发布时间】:2011-04-05 00:34:27
【问题描述】:

快速提问,希望我只是缺少一些简单的东西。好的,我有一个类拥有指向另一个的指针; MainMenuClass 和 NormalGameClass。在 MainMenuClass 内部,我执行以下操作。

 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 release],它会调用 NormalGame 的 dealloc ...两次。 =/ 把我画得一头雾水。

【问题讨论】:

  • 这些是你自己的类还是来自其他库?
  • 这些是刚刚重命名的 UIViewControllers。

标签: iphone retain retaincount


【解决方案1】:

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];**

【讨论】:

  • 呃!非常感谢你。你是救生员。
  • 没问题,很高兴我能帮上忙!
【解决方案2】:

我想 -dismissModalViewControllerAnimated: 调用不会释放视图控制器,直到解雇完成。您确实需要平衡控制器的初始 -alloc/-init 与 -release,但不应期望立即调用 -dealloc 方法。如果对象是自动释放的,它实际上可能会在运行循环的下一次迭代期间被调用。

你是说如果没有 两个 调用来释放你的 dealloc 就不会被调用,或者它根本不会被立即调用?

另外,尽量不要检查保留计数,因为这只会导致混乱和头痛。只需正确关注memory management rules即可。

【讨论】:

  • 我在NormalGame的dealloc方法中放了一个断点。只有一个发布调用,该断点永远不会触发。所以dealloc基本上不会被调用。
猜你喜欢
  • 2011-05-14
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多