2011-09-20 73 views
1

我创建一个新的UIViewController与下面的代码的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玩的效果)。

+0

[gameView release] should be self.gameView = nil; (具体取决于你是否用保留声明了gameView属性) –

回答

4

“你永远不要使用retainCount”。这里有一个非常好的描述,为什么不能: stackoverflow

+0

我得到的是返回的保留计数不正确。那么你认为我的问题是什么?为什么在我解雇一个视图控制器之后,我可以听到主菜单中角色的动作音乐? –

+0

你应该在'viewWillDisappear'方法中停止你的音乐。不要试图用'retainCount'方法解决这个问题。 –

+0

它不仅是音乐的东西。我的dealloc方法也不起作用,音乐播放意味着AI功能正在计数工作? –

1

我建议你不要使用retainCount,因为它通常会给你的对象的实际retaincount提供虚假的信息!

只要按照适当的内存管理做法!这非常简单,只需遵循NARC原则,只发布包含这些词的对象:New Alloc Retain Copy。 NARC! :)

我强烈建议你使用仪器的内存泄漏工具,告诉你哪些对象没有被释放,哪些对象被释放,你试图访问。

1

在GameViewController你有你的释放的背景音乐作为

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

你忘了'[super dealloc];'.... – bbum

+0

@bbum对不起,我把它留作指示。但是,现在更新了我的答案。 – Saran

6

切勿使用retainCount,它不工作,你觉得它的方式。

如果你需要看到保留,发布和自动释放出现一个对象使用仪器:在仪器

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

Example screenshot

+1

最后,有人使用分配工具来跟踪保留计数!谢谢! – bbum