在[obj release]之后,引用计数仍然是1,它应该被解除分配

时间:2011-03-05 16:10:46

标签: objective-c cocoa reference-counting retaincount

当我创建一个对象并检查其保留计数时,我按预期得到1。当我释放对象然后再次检查保留计数时,它仍然是1.不应该取消分配对象,并且保留计数为0?

NSMutableString *str=[[NSMutableString alloc] initWithString:@"hello"];
NSLog(@"reference count is %i",[str retainCount]);
[str release];
NSLog(@"reference count is %i",[str retainCount]);
如果我先将str设置为nil

执行会看到0表示保留计数。那是为什么?

2 个答案:

答案 0 :(得分:2)

不要依赖retainCount。而且不在乎这个。引擎盖下可能会发生很多事情。您只需要确保已经释放了所有拥有的东西。如果您要确保没有泄漏任何内存,请使用Instrument,而不是在NSLog中使用retainCount。

答案 1 :(得分:2)

不要使用retainCount,它在大多数情况下都没有达到预期效果。

您的第二个NSLog正在将取消分配的内存作为对象进行访问。在这种特殊情况下,释放的内存仍然包含足够的NSString中的旧数据,该数据刚刚被释放,以便在调用retainCount方法时程序不会崩溃。如果你用NSZombieEnabled运行它,你会收到一条关于向解除分配的实例发送消息的错误消息。

调用nil时返回0的原因是返回整数的方法在nil对象上调用时总是返回0。