2012-11-26 87 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