发布后存在对象

时间:2011-10-14 07:22:54

标签: objective-c

任何人都可以向我解释为什么类对象在发布后仍然存在。这是代码

#import <Foundation/Foundation.h>
#import "MyClass.h"
int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyClass *class = [[MyClass alloc] init];

    NSLog(@"%@", [class showMouse]);
    NSLog(@"%@", [class printKbd]);

    [class release];

    NSLog(@"%@", [class printKbd]);
    //still exist

    [pool drain];
    return 0;
}

1 个答案:

答案 0 :(得分:2)

实际上,dealloc 会被调用,您可以通过在NSLog(@"dealloc called") dealloc MyClass方法中添加*class来检查它。

为什么它仍然有效?当一个对象被释放时,内存不会被归零,它只是标记为系统可以自由使用。结果,代码可能仍然存在于指针的地址处,而[class printKbd]只是指向存储器块的指针。 Here's the great SO answer that explains it in details

需要注意的重要一点是,如果程序执行时间过长,对nil的调用很可能会崩溃。这就是为什么将{{1}}赋给指针很重要,只是为了确保我们不会访问未定义的内存部分。