在dealloc中调用super是否重要?

时间:2010-08-19 15:47:44

标签: iphone objective-c cocoa cocoa-touch memory

- (void)dealloc {
    [super dealloc];
    [receivedData release]; receivedData = nil;
}

- (void)dealloc {
    [receivedData release]; receivedData = nil;
    [super dealloc];
}

3 个答案:

答案 0 :(得分:16)

是的,它在调用[super dealloc]时绝对匹配。调用[super dealloc]后,您就不能再依赖NSObject(或任何根类)机制来正常运行。毕竟,你的超类'-dealloc方法应该调用它的超类'等,直到调用根类'-dealloc方法。此时,这些类分配用于完成其工作的所有内容都可能消失,如果您尝试使用其中任何一个,则处于未定义的区域。

您的-dealloc方法应始终如下

- (void)dealloc
{
   // release my own stuff first

   [super dealloc];
}

答案 1 :(得分:13)

是。持续。总是

答案 2 :(得分:4)

是的,[super dealloc]必须始终是最后一个,如上所述,因为引用self或通常认为理所当然的任何其他内部都不会起作用,并且可能会崩溃,如上所述。

上面没有说明的另一个原因是ivars位于self指向的内存块中,所以如果你在[super dealloc]之后对那些ivars做任何事情(比如发布)那么你会也可以解除引用释放的内存。

我上面说'可能会崩溃',因为当你不正确地执行此操作时,它往往不会崩溃,这是有道理的,考虑到内存在重用之前不会被覆盖。这使情况变得更糟,因为你可能会有一个只会偶尔发生的错误,这使得它更难以找到,以防它在你脸上爆炸。

除此之外,如果您在[super dealloc]之后发布局部变量或诸如此类的东西,那么你就完全没问题了,如果你真的想要的话,你可以这样做

id local = ivar;
[super dealloc];
[local release];

安全,但为了保持一致,请不要。

总之,是的,[super dealloc] 必须是-dealloc中的最后一件事。