2

有人能告诉我如果你在 Objective-C 中重写 dealloc 方法会发生什么吗?就像它会崩溃还是会开始到处泄漏内存一样。我一直想知道会发生什么以及为什么有必要阻止程序员直接使用 dealloc。

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

编辑:对不起,伙计们不清楚。我主要是在谈论术语或 ARC 类型编码。

4

2 回答 2

16

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

但是,要记住的关键是,每次覆盖-dealloc总是以调用[super dealloc].

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

于 2013-01-18T00:49:07.187 回答
9

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

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

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

于 2013-01-18T00:51:23.343 回答