为什么在释放对象时仍然可以调用Objective C方法?

时间:2011-04-15 06:58:58

标签: objective-c

班级定义:

#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

为什么在释放对象时仍会调用第二个方法?

3 个答案:

答案 0 :(得分:3)

释放对象只会将其使用的内存标记为可用于其他目的。它不会用零或类似的东西覆盖它。在您的示例中,您尚未创建任何新对象,因此没有任何机会可以重用以前称为“m”的内存。

这就是为什么发布对象为指针分配nil的常见模式,以防止意外重复使用无效对象:

[m release]
m = nil;

答案 1 :(得分:1)

那是因为该对象的内存仍然存在并且还没有被垃圾覆盖。此外,所讨论的方法不依赖于任何其他(已释放的)实例变量。简而言之:只是它运作的纯粹机会。

尝试设置环境变量NSZombieEnabled并再次运行它,看看你真的只是“运气”。

答案 2 :(得分:0)

访问释放的内存是未定义的行为。当您调用未定义的行为时,任何事情都可能发生。这属于“任何事情”的标题,因此发生这种情况是合理的 - 访问错误的对象或者只是崩溃,这也可能是结果。