2012-11-26 52 views

回答

3

在non-ARC下,99%的情况下你不应该重写发布方法。

我已经看到只有一种情况需要重写释放方法 - 一种单例,它强制类实际上有一个单一实例,无论你调用alloc多少次。

这样重写不仅release方法,也allowWithZone:retain,“retainCount`等(它实际上是不常见的实现那种单身的)

+2

在ARC下有很多情况下你想重写'dealloc'方法...例如,如果你想取消订阅从任何观察机制(KVO,通知中心...) – Guillaume

+1

“在ARC下,您不应该重写任何方法。” - 这是错误的。 – 2012-11-26 11:13:57

+0

thx @ H2CO3,这是真的。至少dealloc仍然有用 – PeterWong

0

如果您不使用ARC,则应该覆盖-[MyObject dealloc] dealloc方法以释放对象内的所有保留对象。我从来没有发现我需要重写发布方法的情况。

如果您使用的是ARC,通常可以避免重写-dealloc方法,除非您使用的ARC不会像sqlite指针或其他东西那样释放。

3

哪一个是最好的方法?覆盖releasedealloc方法?

- dealloc,绝对。你绝不应该重写- release

为什么?

一,因为release做了一堆内部的东西。二,,因为如果release被调用,它的确如此而不是意味着对象被解除分配。

所以你会释放你的ivars或无意中你的属性。当我们能够拥有世界和平时,谁想要一个丑陋的段落错误?

如果一个对象真的被释放,将会调用- dealloc

+0

不依赖dealloc来处理与内存无关的任何事情。关闭插座 –

+0

@ Daij-Djan嗯,我认为这取决于。对象实现封装,如果析构函数需要关闭套接字,那么它需要关闭该套接字... – 2012-11-26 22:20:06

+0

是的,但运行时不能保证(弧可以优化时序)或者它被调用...例如当一个应用程序退出时......它实际上是我现在可以看到的唯一明智的理由 –

0

不覆盖或者任何东西不涉及到内存管理 - 你不知道什么时候这些方法甚至被调用。

例外当你要的dealloc:

  • 删除KVO /通知中心观察员
  • 重新分配手动分配的内存(ARC)/释放你的高德(非弧形)
+1

“不要重写” - 我会高兴地检查你的应用程序的内存泄漏... – 2012-11-26 19:03:55

+0

:P读取我的异常之前做出讽刺评论;)也许我重新格式化我的答案,虽然;) –

+0

对不起,我没有注意你正在例外 - 我现在意识到你是对的。 – 2012-11-26 22:19:13