2011-03-05 15 views
2

当我创建一个对象并检查其保留计数时,我得到1如预期的那样。当我释放对象然后再次检查保留计数时,它仍然是1.不应该释放对象,并且保留计数为0?引用计数在[obj发布]后仍然是1,当它应该被释放时

NSMutableString *str=[[NSMutableString alloc] initWithString:@"hello"]; 
NSLog(@"reference count is %i",[str retainCount]); 
[str release]; 
NSLog(@"reference count is %i",[str retainCount]); 

看到0的保留计数如果我设置strnil第一。这是为什么?

回答

2

请勿使用retainCount,它在大多数情况下不符合您的期望。

您的第二个NSLog正在访问释放的内存作为对象。在这种特殊情况下,该释放的内存仍然包含足够的NSString中的旧数据,该数据刚释放时程序不会在调用retainCount方法时崩溃。如果你使用NSZombieEnabled执行此操作,则会收到有关将消息发送到释放实例的错误消息。

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

+0

它很有说服力......谢谢......当我用NSZombieEnabled启用的编程工具运行时,程序崩溃了...... – devaditya 2011-03-05 16:36:03

+0

说得简洁;发送一个解除分配的对象会产生未定义的行为。故事结局。 – bbum 2011-03-05 18:54:02

2

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

+0

这个答案是预期的...以及它写道[obj发布]引用计数减少后...所以这只是一个实际的实现...不检查任何泄漏......无论如何感谢.. – devaditya 2011-03-05 16:32:22

相关问题