【问题标题】:Does it matter when super is called in dealloc?在 dealloc 中调用 super 是否重要?
【发布时间】:2011-04-01 05:10:45
【问题描述】:
- (void)dealloc {
    [super dealloc];
    [receivedData release]; receivedData = nil;
}

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

【问题讨论】:

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


    【解决方案1】:

    是的。最后的。总是。

    【讨论】:

    • 当你使用 [super dealloc];基础对象被销毁。如果您使用在基础对象中声明的某些数据,则会导致崩溃。你应该最后调用它
    【解决方案2】:

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

    你的 -dealloc 方法应该总是看起来像

    - (void)dealloc
    {
       // release my own stuff first
    
       [super dealloc];
    }
    

    【讨论】:

    • 感谢您的描述性回答!只是好奇,这会导致 KERN_PROTECTION 错误或 KERN_INVALID_ADDRESS 吗?
    • @Sheehan Alam:NSObject 的dealloc 释放了对象。在它完成之后访问self 就像访问任何已释放的内存一样——它可能会导致错误或者它可能会做更多奇怪的事情。
    • @Sheeham,是的。这是一种可能。
    • 具体来说,你想发布你自己的东西。你永远不会想做像 [myIvarThing dealloc] 这样的事情,但我确定这就是你的意思 :)
    【解决方案3】:

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

    上面没有提到的另一个原因是 ivars 位于 self 指向的内存块中,所以如果你在 [super dealloc] 之后对这些 ivars 做任何事情(比如释放),你也将被解除引用释放记忆。

    我在上面说“可能会崩溃”,因为当您错误地执行此操作时,它实际上往往不会崩溃,考虑到内存在被重用之前不会被覆盖,这是有道理的。这使情况变得更糟,因为您可能会遇到仅有时会发生的错误,如果它确实在您面前爆炸,则很难找到它。

    除此之外,如果你在[super dealloc] 之后释放一个局部变量或诸如此类的东西,你完全可以,如果你真的想要,你可以做类似的事情

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

    安全,但为了保持一致性,不要这样做。

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2011-11-17
      • 2023-04-07
      • 2012-08-08
      • 2011-09-29
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多