班级定义:
#import "MyClass.h"
@implementation MyClass
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)print
{
NSLog(@"Hello World");
}
@end
主文件:
MyClass * m = [[MyClass alloc]init];
[m print];
[m release];
[m print];
结果:
Hello World
Hello World
为什么在释放对象时仍会调用第二个方法?
答案 0 :(得分:3)
释放对象只会将其使用的内存标记为可用于其他目的。它不会用零或类似的东西覆盖它。在您的示例中,您尚未创建任何新对象,因此没有任何机会可以重用以前称为“m”的内存。
这就是为什么发布对象和为指针分配nil的常见模式,以防止意外重复使用无效对象:
[m release]
m = nil;
答案 1 :(得分:1)
那是因为该对象的内存仍然存在并且还没有被垃圾覆盖。此外,所讨论的方法不依赖于任何其他(已释放的)实例变量。简而言之:只是它运作的纯粹机会。
尝试设置环境变量NSZombieEnabled并再次运行它,看看你真的只是“运气”。
答案 2 :(得分:0)
访问释放的内存是未定义的行为。当您调用未定义的行为时,任何事情都可能发生。这属于“任何事情”的标题,因此发生这种情况是合理的 - 访问错误的对象或者只是崩溃,这也可能是结果。