【问题标题】:Sending a message to deallocated object is working向释放的对象发送消息正在工作
【发布时间】:2010-12-07 05:51:25
【问题描述】:

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() 应该打印“消息retainCount sent to freed object=0x103eb0”。 如果您使用 Leopard,一切正常,但在 Snow Leopard 中,第二个 NSLog 仍会打印 1

这是雪豹版 Xcode 中的错误吗?

【问题讨论】:

    标签: objective-c cocoa memory-management


    【解决方案1】:

    请参阅this 问题。

    这不是错误。一旦您释放了一个保留计数为 1 的对象,objc 运行时只需调用 dealloc 并且不会费心减少保留计数。这就是它一直以来的工作方式。此外,仅仅因为一个对象已被发送dealloc 并不意味着它在堆上的数据会立即被销毁。它只是标记为以后销毁。

    【讨论】:

    • 内存与其说是“标记为销毁”,不如说是“可供其他东西重用”。但是当它被释放时,没有任何东西会显式地覆盖释放的内存。
    【解决方案2】:

    向已释放的实例发送消息是未定义的行为。你不应该这样做。它可以工作;它不能。因为你不应该这样做,所以他们不必为了结果与你的期望一致。

    【讨论】:

      【解决方案3】:

      在应用程序的环境变量中将NSZombieEnabled 设置为YES 将允许Foundation 检测到此编程错误,并将其报告为有助于调试的控制台消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多