回答
在non-ARC下,99%的情況下你不應該重寫發佈方法。
我已經看到只有一種情況需要重寫釋放方法 - 一種單例,它強制類實際上有一個單一實例,無論你調用alloc多少次。
這樣重寫不僅release
方法,也allowWithZone:
,retain
,「retainCount`等(它實際上是不常見的實現那種單身的)
如果您不使用ARC,則應該覆蓋-[MyObject dealloc]
dealloc方法以釋放對象內的所有保留對象。我從來沒有發現我需要重寫發佈方法的情況。
如果您使用的是ARC,通常可以避免重寫-dealloc方法,除非您使用的ARC不會像sqlite指針或其他東西那樣釋放。
哪一個是最好的方法?覆蓋
release
或dealloc
方法?
- dealloc
,絕對。你絕不應該重寫- release
。
爲什麼?
一,因爲release
做了一堆內部的東西。二,,因爲如果release
被調用,它的確如此而不是意味着對象被解除分配。
所以你會釋放你的ivars或無意中你的屬性。當我們能夠擁有世界和平時,誰想要一個醜陋的段落錯誤?
如果一個對象真的被釋放,將會調用- dealloc
。
不依賴dealloc來處理與內存無關的任何事情。關閉插座 –
@ Daij-Djan嗯,我認爲這取決於。對象實現封裝,如果析構函數需要關閉套接字,那麼它需要關閉該套接字... – 2012-11-26 22:20:06
是的,但運行時不能保證(弧可以優化時序)或者它被調用...例如當一個應用程序退出時......它實際上是我現在可以看到的唯一明智的理由 –
不覆蓋或者任何東西不涉及到內存管理 - 你不知道什麼時候這些方法甚至被調用。
例外當你要的dealloc:
- 刪除KVO /通知中心觀察員
- 重新分配手動分配的內存(ARC)/釋放你的高德(非弧形)
「不要重寫」 - 我會高興地檢查你的應用程序的內存泄漏... – 2012-11-26 19:03:55
:P讀取我的異常之前做出諷刺評論;)也許我重新格式化我的答案,雖然;) –
對不起,我沒有注意你正在例外 - 我現在意識到你是對的。 – 2012-11-26 22:19:13
- 1. autorelease與釋放dealloc
- 2. 在dealloc和/或release上釋放/釋放對象嗎?
- 3. 我應該釋放的dealloc
- 4. 不能釋放NSFetchedResultsController在dealloc
- 5. 釋放viewDidUnload和dealloc兩者?
- 6. Java不釋放finalize()覆蓋的對象
- 7. 覆蓋或覆蓋
- 8. 覆蓋保留/釋放在ARC
- 9. Objective C:子類化,覆蓋dealloc
- 10. 伊娃和財產釋放dealloc
- 11. Objective-C阻止NSString被釋放/ dealloc
- 12. 如何在-dealloc中正確釋放CGMutablePathRef?
- 13. 在哪裏釋放一個對象? dealloc或ViewDidUNload
- 14. 類似的方法來覆蓋保留和釋放在Swift 1或2?
- 15. 圍繞註釋覆蓋
- 16. 用反射覆蓋註釋?
- 17. orm.xml不會覆蓋註釋
- 18. 在dealloc中釋放的ivars給「指針被釋放沒有分配」的錯誤
- 19. 釋放被覆蓋的數據的磁盤空間?
- 20. 線程內的UIImage未被釋放/覆蓋
- 21. 在我自己的類中覆蓋保留和釋放方法
- 22. 覆蓋或重載?
- 23. 在UIView dealloc方法中,你是否會釋放你的屬性BEFORE或AFTER [super dealloc]?
- 24. 釋放或自動釋放的對象
- 25. 爲什麼窗口在應用中自動釋放:didFinishLaunchingWithOptions:並在dealloc中釋放?
- 26. dealloc中的屬性:release然後設置爲nil?或者簡單地釋放
- 27. 谷歌地圖v3 PNG覆蓋不釋放內存時發佈
- 28. 覆蓋對象實例不釋放內存?
- 29. 覆蓋開放()在imaplib
- 30. Javassist覆蓋現有的註釋
不使用ARC,對吧? –