任何人都可以向我解释为什么类对象在发布后仍然存在。这是代码
#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;
}
答案 0 :(得分:2)
实际上,dealloc 会被调用,您可以通过在NSLog(@"dealloc called")
dealloc
MyClass
方法中添加*class
来检查它。
为什么它仍然有效?当一个对象被释放时,内存不会被归零,它只是标记为系统可以自由使用。结果,代码可能仍然存在于指针的地址处,而[class printKbd]
只是指向存储器块的指针。 Here's the great SO answer that explains it in details
需要注意的重要一点是,如果程序执行时间过长,对nil
的调用很可能会崩溃。这就是为什么将{{1}}赋给指针很重要,只是为了确保我们不会访问未定义的内存部分。