有人能告诉我如果你在 Objective-C 中重写 dealloc 方法会发生什么吗?就像它会崩溃还是会开始到处泄漏内存一样。我一直想知道会发生什么以及为什么有必要阻止程序员直接使用 dealloc。
在什么情况下你必须做这样的事情?
编辑:对不起,伙计们不清楚。我主要是在谈论术语或 ARC 类型编码。
有人能告诉我如果你在 Objective-C 中重写 dealloc 方法会发生什么吗?就像它会崩溃还是会开始到处泄漏内存一样。我一直想知道会发生什么以及为什么有必要阻止程序员直接使用 dealloc。
在什么情况下你必须做这样的事情?
编辑:对不起,伙计们不清楚。我主要是在谈论术语或 ARC 类型编码。
在非 ARC 代码中,覆盖-dealloc
是一件极其常见的事情。事实上,你很难找到一个不覆盖它的类。
但是,要记住的关键是,每次覆盖-dealloc
总是以调用[super dealloc]
.
当然,在 ARC 代码中,覆盖-dealloc
要少得多。如果你覆盖它,你不会调用[super dealloc]
,因为编译器会为你插入它。但请记住,这仅适用于 ARC。
在 ARC 覆盖该dealloc
方法非常普遍之前,您正在释放已释放实例拥有的 ivars。现在,使用 ARC,不太常见,但是,在某些特殊情况下,您可能必须这样做,例如当您从观察中注销实例时使用NSNotificationCenter
.
您谈论的规则是不要dealloc
直接调用(而不是覆盖),这通常会导致崩溃,因为您绕过了 Cocoa 的内部引用计数系统。
编辑:根据您的编辑,如果您[super dealloc]
在 ARC 下调用,您将收到编译时错误。如果没有错误,它可能会导致重复dealloc
调用,这会使你的程序崩溃。