向已释放的对象发送消息正在起作用

时间:2009-10-16 00:19:41

标签: objective-c cocoa memory-management

Objective-C中最简单的代码会导致奇怪的行为:

#import Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSObject *obj = [[NSObject alloc] init];
    NSLog(@"retain count %d",[obj retainCount]);//print 1
    [obj release];//obj deallocated
    NSLog(@"retain count %d",[obj retainCount]); //still printing 1 in Snow Leopard! Why??


    [pool drain];
    return 0;
}

第二个NSLog()应该打印“message retainCount send to freed object = 0x103eb0”。 如果你使用Leopard一切正常,但在Snow Leopard中,第二个NSLog仍会打印1

这是雪豹版Xcode中的错误吗?

3 个答案:

答案 0 :(得分:6)

请参阅this问题。

这不是一个错误。一旦释放保留计数为1的对象,objc运行时只需调用dealloc并且不会减少保留计数。这就是它总是有效的方式。另外,仅仅因为发送了一个对象dealloc并不意味着它的数据立即被销毁。它只是稍后标记为毁灭。

答案 1 :(得分:2)

向解除分配的实例发送消息是未定义的行为。你不应该这样做。它可以工作;它不能。因为你不应该这样做,所以他们不必这样做,以便结果与你的期望一致。

答案 2 :(得分:1)

在应用程序的环境变量中将NSZombieEnabled设置为YES将允许Foundation检测此编程错误,并将其作为控制台消息报告,这有助于调试。