【问题标题】:Reference count is still 1 after [obj release], when it should be deallocated[obj release] 后引用计数仍为 1,何时应该释放
【发布时间】:2011-03-05 16:10:46
【问题描述】:

当我创建一个对象并检查它的保留计数时,我得到了预期的 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。这是为什么呢?

【问题讨论】:

    标签: objective-c cocoa reference-counting retaincount


    【解决方案1】:

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

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

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

    【讨论】:

    • 它很有说服力...谢谢...当我使用启用 NSZombieEnabled 的编程工具运行时,程序也崩溃了...
    • 简洁地说;消息传递释放的对象会产生未定义的行为。故事结束。
    【解决方案2】:

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

    【讨论】:

    • 这个答案是意料之中的......正如它所写的那样 [obj release] 引用计数减少......所以这只是一个实际的实现......不检查任何泄漏...... .无论如何谢谢...
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2011-07-06
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多