我想知道一个对象被自动释放了多少次。我使用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 框架中找到(或找到可能)的东西。
我同意答案,即使有可能获得更好的工具(僵尸,泄漏,静态分析器)存在的自动释放计数。