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中的错误吗?
答案 0 :(得分:6)
请参阅this问题。
这不是一个错误。一旦释放保留计数为1的对象,objc运行时只需调用dealloc
并且不会减少保留计数。这就是它总是有效的方式。另外,仅仅因为发送了一个对象dealloc
并不意味着它的数据立即被销毁。它只是稍后标记为毁灭。
答案 1 :(得分:2)
向解除分配的实例发送消息是未定义的行为。你不应该这样做。它可以工作;它不能。因为你不应该这样做,所以他们不必这样做,以便结果与你的期望一致。
答案 2 :(得分:1)
在应用程序的环境变量中将NSZombieEnabled
设置为YES
将允许Foundation检测此编程错误,并将其作为控制台消息报告,这有助于调试。