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

0 cocoa memory-management objective-c

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*c W 6

看到这个问题.

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