2

当我创建一个对象并检查其保留计数时,我得到了预期的 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]);

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

4

2 回答 2

2

不要使用retainCount,在大多数情况下,它不会达到您的预期。

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

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

于 2011-03-05T16:32:09.257 回答
2

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

于 2011-03-05T16:21:21.237 回答