覆盖objective-c中的dealloc方法

时间:2013-01-18 00:32:48

标签: objective-c dealloc

有人能告诉我如果覆盖Objective-C中的dealloc方法会发生什么?因为它会崩溃或者只是开始泄漏记忆。我一直想知道会发生什么以及为什么有必要阻止程序员直接使用dealloc。

在什么情况下你必须做这样的事情?

编辑:对不起家伙不清楚。我主要用术语或ARC类型编码。

2 个答案:

答案 0 :(得分:15)

在非ARC代码中,覆盖-dealloc是非常常见的事情。事实上,你很难找到一个没有覆盖它的类。

但要记住的关键是,-dealloc的每一次覆盖始终以对[super dealloc]的调用结束。

当然,在ARC代码中,覆盖-dealloc的情况要少得多。如果你覆盖它,你不会调用[super dealloc],因为编译器会为你插入它。但请记住,这只适用于ARC。

答案 1 :(得分:9)

在ARC覆盖dealloc方法非常普遍之前,您正在释放已释放的实例所拥有的ivars。现在,使用ARC时,不太常见,但是,在某些特殊情况下,您可能不得不这样做,例如当您从NSNotificationCenter观察时取消注册实例时。

你谈到的规则是不要直接调用dealloc(不要覆盖),这通常会导致崩溃,因为你绕过了Cocoa的内部引用计数系统。

编辑:根据您的编辑,如果您在ARC下调用[super dealloc],则会出现编译时错误。如果没有错误,可能会导致重复dealloc调用,这会导致程序崩溃。