UIViewController保留计数问题

时间:2011-09-20 09:52:08

标签: iphone objective-c ios

我正在使用以下代码

创建一个新的UIViewController
GameViewController *temp = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
NSLog(@"retain count%d", [temp retainCount]);
temp.backgroundMusic = backgroundMusic;
self.gameView = temp;
[temp release];     
[self presentModalViewController:gameView animated:YES];                
[gameView release];

但是当我查看保留计数时,我的临时视图控制器返回4。

这怎么可能?因为它是4,当我解除视图控制器时,我无法将其从内存中删除,我的游戏正在继续播放。 (我可以看到AI播放的效果)。

4 个答案:

答案 0 :(得分:6)

永远不要使用retainCount,它不会像你想象的那样工作。

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录以设置选项)。导致选择器运行,停止记录,搜索那里的ivar(datePickerView),向下钻取,你将能够看到所有保留,释放和自动释放发生的位置。

Example screenshot

答案 1 :(得分:4)

“你永远不应该使用retainCount”。这是一个非常好的描述,为什么不: stackoverflow

答案 2 :(得分:1)

我建议你永远不要使用retainCount,因为它通常会提供关于你对象实际零售额的虚假信息!!!!

只需遵循适当的内存管理实践!!!!它非常简单,只需遵循NARC原则,只释放具有以下单词的对象:New Alloc Retain Copy。 NARC! :)

我强烈建议您使用仪器中的内存泄漏工具,该工具会告诉您哪些对象未被释放以及哪些对象已发布且您尝试访问这些对象。

答案 3 :(得分:1)

在GameViewController中,您已将背景音乐发布为

- (void)viewDidLoad{
   //Other nils
   self.backgroundMusic = nil;
}
- (void)dealloc{
    //Other releases
    [backgroundMusic release];
    [super dealloc];
}