覆盖`release`进行调试是否安全?

时间:2010-04-18 12:26:22

标签: objective-c cocoa-touch debugging memory-leaks release

有时我需要找出一个对象是否真的会被释放。我当然可以使用乐器,但这需要花费很多时间,而且我必须搜索数百万个对象,所以我习惯这样做:

-(void)release {
    NSLog(@"I'm released");
    [super release];
}

但问题是:安全吗?当我覆盖-(void)release时,我可以遇到任何问题吗?还有,真的是void吗?如果我构建我的应用程序以进行分发,但是每次事故都会留在那里呢?还是只是安全吗?感谢

2 个答案:

答案 0 :(得分:19)

没关系,但请将其限制为仅用于调试。


不是void,而是oneway void

-(oneway void)release {
    NSLog(@"I'm released"); // <-- remeber the @.
    [super release];
}

请注意,如果您只为NSObject重写此项,那么发送到“免费桥接容器”的-release消息(例如NSCFArray等)将会被忽略,因为它们也会覆盖{{1}转发到-release

答案 1 :(得分:5)

释放消息仅减少实例的引用计数。

如果您想知道实例是否已被释放,那么最好是覆盖dealloc消息:

- (void)dealloc {
    NSLog(@"I am deallocated");
    [super dealloc];
}

明智地使用它。