有人能告诉我如果覆盖Objective-C中的dealloc方法会发生什么?因为它会崩溃或者只是开始泄漏记忆。我一直想知道会发生什么以及为什么有必要阻止程序员直接使用dealloc。
在什么情况下你必须做这样的事情?
编辑:对不起家伙不清楚。我主要用术语或ARC类型编码。
答案 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
调用,这会导致程序崩溃。