使用pushViewController进行内存管理

时间:2011-05-10 11:24:45

标签: iphone ios memory-management pushviewcontroller

我对内存管理技术的态度仍然不是很好,并且想知道是否有人可以向我解释这种奇怪的行为。考虑一下我一直在测试的这三段代码:

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
NSLog(@"dof retain count = %d", [dofView retainCount]); 

此日志:保留计数= 1.这很好。

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[dofView release];
NSLog(@"dof retain count = %d", [dofView retainCount]); 

这个日志:保留计数= 1.不应该是0 ??

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
NSLog(@"dof retian count = %d", [dofView retainCount]);

这个日志:保留计数= 5.我不明白为什么它的五个?

任何人都对此有所了解吗?我担心每次创建新视图时我都在吃掉记忆。

谢谢!

7 个答案:

答案 0 :(得分:2)

不要依赖retainCount进行内存分析。浏览Memory Management上的参考文档以获取更多信息

答案 1 :(得分:2)

强烈建议不要考虑保留计数,它不会向您提供任何有价值的信息。如果你想知道某些东西是否被正确释放,你应该在你的类的dealloc方法中放置一个断点或一个日志条目 - 当调用dealloc时,很快就会释放该对象。除了仪器应用程序,这是我用来查找保留周期。

答案 2 :(得分:1)

When to use -retainCount?

retaincount似乎毫无用处

答案 3 :(得分:1)

重要的是要知道发布会立即发生(自动释放需要一段时间)。

那么为什么你的对象的保留计数仍为1?

因为它已被解除分配 - 它不再是你的对象了,它只是一些免费记忆!

尝试这样做:

NSObject* o = [[NSObject alloc] init];
NSLog(@"retain count = %d", [o retainCount]); 
[o retain];
NSLog(@"retain count = %d", [o retainCount]); 
[o release];
NSLog(@"retain count = %d", [o retainCount]); 
[o release];
NSLog(@"retain count = %d", [o retainCount]); 

你得到了输出

retain count = 1
retain count = 2
retain count = 1
retain count = 1

你可能期望最后一行说0,而不是1.但是,如果它将被释放,它将不会减少保留计数 - 这将是重点!

实际上,最后一行输出任何东西而不会崩溃这一事实很幸运 - 因为该对象已被解除分配,没有什么能阻止该内存被其他东西使用 - 它实际上只是随机数据。这正是导致EXC_BAD_ACCESS崩溃的那种错误:)

实际上,您在最终NSLog上收到编译器分析器警告,因为您正在将消息传递给不再存在的对象:)


至于保留计数为5 - 我只能回应其他答案 - 你不知道内部对象发生了什么 - 只是因为你只调用了retain一次并不意味着没有其他人称为retain :)

只要您为每次保留而释放,就会做出正确的事。

如果您担心泄漏,请使用分析器并检查!

答案 4 :(得分:0)

retainCount属性取决于UINavigationController如何处理您正在推送的控制器。如果它在UIViewController对象中保留了不同的次数,你不应该担心。重要的是,当使用该对象时,你会在不再需要它时释放它。

E.g。在这种情况下,由于您要将新控制器推送到导航器,因此您应该这样做:

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
[dofView release];

对象的保留计数可能不会立即更新,因此您不应该真正关心该计数。

如果您认为泄漏内存,则应使用Xcode内部的分析工具(搜索内存泄漏)。

希望这有帮助。

答案 5 :(得分:0)

不依赖保留计数。在过去我也尝试检查内存管理的保留计数,但它总是让我感到困惑(当保留计数混淆我[http://stackoverflow.com/q/5483357/644149]时检查此链接。只需按照简单的指导线然后你将你的应用程序没有内存泄漏

当你使用alloc,new,copy,retain时你也应该释放该对象。简单

答案 6 :(得分:-1)

release调用不会立即生效,因此保留计数可能看起来不正确。您可以使用Leaks工具来跟踪内存问题,但只要您遵循内存管理规则,通常就应该没问题。