我对内存管理技术的态度仍然不是很好,并且想知道是否有人可以向我解释这种奇怪的行为。考虑一下我一直在测试的这三段代码:
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.我不明白为什么它的五个?
任何人都对此有所了解吗?我担心每次创建新视图时我都在吃掉记忆。
谢谢!
答案 0 :(得分:2)
不要依赖retainCount
进行内存分析。浏览Memory Management上的参考文档以获取更多信息
答案 1 :(得分:2)
强烈建议不要考虑保留计数,它不会向您提供任何有价值的信息。如果你想知道某些东西是否被正确释放,你应该在你的类的dealloc方法中放置一个断点或一个日志条目 - 当调用dealloc时,很快就会释放该对象。除了仪器应用程序,这是我用来查找保留周期。
答案 2 :(得分:1)
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工具来跟踪内存问题,但只要您遵循内存管理规则,通常就应该没问题。