【发布时间】:2011-11-22 22:20:14
【问题描述】:
我想知道一个对象被自动释放了多少次。我使用objective c 的时间足够长,通常可以直接知道对象是否已自动释放,但是我经常看到处理内存和保留计数的问题。在某些时候,答案总是会结束,“你不能相信一个对象的retainCount”——我同意,但是如果你能确定一个对象被自动释放多少次,那么你实际上可以信任 如果您添加了以下类别,则为 retainCount:
@interface NSObject (NSObject_MemoryDebugging)
- (NSUInteger) autoReleaseCount;
- (NSUInteger) retainCountWithAutoRelease;
@end
@implementation]
/** Determine how many times this object has been marked for autorelease **/
- (NSUInteger) autoReleaseCount;
{
// ??? not sure how to figure this out.
return 0;
}
- (NSUInteger) retainCountWithAutoRelease
{
NSUInteger retainCount = [self retainCount];
NSUInteger autoReleaseCount = [self getAutoReleaseCount]; // ???
return retainCount - autoReleaseCount;
}
@end
不可变类型仍然会有一个例外,因为它们通常会在复制期间增加保留计数,因此您仍然不能信任这些保留计数。
我不建议什么
我不是在寻找在生产代码中使用 retainCount 的答案。但是,我认为这对于调试内存问题的人来说很有价值。
我想有些人会讨厌这个问题,因为程序员不应该关心对象被自动释放了多少次。编码应该是关于平衡分配、保留、复制、新的发布、故事的结尾。但是,这样做的目的是帮助人们敲打他们的头。 [NSObject retainCount] 烧了很多人,这个问题的答案会很酷。
我确信有一种方法可以确定对象被自动释放的次数。我只是不知道它是什么,因此提出了问题。
查看类似问题:Objects inside NSAutoreleasePool in objective-c。
编辑
谢谢大家的回答。你可能会发现这个有趣 => Ariel 指出 GNUStep 的 Cocoa 实现,特别是 NSAutoReleasePool 有这个方法:+(NSUInteger)autoreleaseCountForObject:(id)anObject。此方法很慢,并且仅从调用者线程上的 NSAutoReleasePools 返回自动释放计数。仍然......有趣的是它在那里。文档引用它实际上只对调试有用。这确实是我希望以某种方式在 Cocoa 框架中找到(或找到可能)的东西。
我同意这些答案,即使有可能获得更好的工具(僵尸、泄漏、静态分析器)存在的自动释放计数。
【问题讨论】:
-
Apple 正在将 autorelease 推送到语言/编译器中,任何获取此信息的尝试都将是短暂的 - 搜索 Automatic Reference Counting 以了解详细信息。跨度>
-
开启NSZombies,你可以随时引用任何被创建的对象——如果它是僵尸,你知道它已经被释放到0
-
你说,“我认为这对调试内存问题的人来说很有价值。”你能举一个具体的例子说明知道对象的自动释放计数是解决问题的最佳方法吗?我一直在想一个,但我不能。
-
一个有效且有趣的问题。但最终,答案仍然是“不要打扰,还有更好的工具”。特别是,如果没有完全考虑线程,“......您实际上可以信任retainCount......”的说法是不正确的。同样,框架中的某些类可以直接修改其保留计数而无需调用方法,而其他类与自动释放池一起工作而不会自动释放。
标签: objective-c ios memory-leaks nsautoreleasepool retaincount