當我註冊的對象富從另一個對象酒吧(使用的addObserver:...)收到KVO通知,如果我再取消分配富我需要發送removeObserver:forKeyPath:
消息酒吧在-dealloc?在Cocoa中,我需要在釋放對象時從接收KVO通知中刪除對象嗎?
回答
您需要使用-removeObserver:forKeyPath:
在-[NSObject dealloc]
運行之前刪除觀察者,所以是的,在您班級的-dealloc
方法中可以使用。
更好的是,雖然會有一個確定性點,凡是擁有正在進行觀察的對象都可以告訴它已完成並將最終解除分配。這樣,當不再需要觀察事物時,不管何時實際釋放,都可以立即停止觀察。
要記住這一點很重要,因爲可可中的對象的生命週期並不像某些人認爲的那樣確定。各種各樣的Mac OS X框架本身將發送您的對象-retain
和-autorelease
,延長他們的生活超出你可能會認爲它會。此外,當您轉換到Objective-C垃圾回收時,您會發現-finalize
將在非常不同的時間運行 - 並且在非常不同的環境中運行 - 比-dealloc
的運行時間更長。一方面,最終確定發生在另一個線程上,所以你真的不能將安全地發送到-finalize
方法中的另一個對象。
棒內存(和其他稀缺資源)管理-dealloc
和-finalize
,並使用單獨的-invalidate
方法有一個業主告訴你在一個確定的點用它做一個對象;做一些事情,比如去除那裏的KVO觀察。你的代碼的意圖會更清晰,你將會減少微妙的錯誤來照顧。
我通過痛苦的體驗獲得了一些額外的信息:雖然NSNotificationCenter在垃圾回收下運行時使用了零引用弱引用,但KVO卻沒有。因此,您可以避免在使用GC時不移除NSNotificationCenter觀察者(使用保留/釋放時,仍需要移除觀察者),但仍必須移除KVO觀察者,如Chris所述。
肯定與克里斯同意「堅持記憶(和其他稀缺資源)管理在-dealloc和-finalize ...」評論。很多時候,我會看到人們嘗試在其dealloc函數中使NSTimer對象無效。問題是,NSTimer保留它的目標。所以,如果NSTimer的目標是自己的,dealloc將永遠不會被調用,導致一些潛在的令人討厭的內存泄漏。
的invalidate -invalidate
和做其他內存清理你的dealloc
和finalize.
- 1. 我是否需要從此示例中釋放臨時對象?
- 2. allocWithZone對象需要釋放
- 3. 我是否需要釋放UITouch對象?
- 4. 我是否需要釋放此對象?
- 5. 我是否需要在php中釋放對象?
- 6. KVO +託管對象 - 接收太多通知
- 7. 如何告訴(託管)對象通知其KVO其屬性需要被回收?
- 8. 需要幫助從普通的對象數組中刪除指定的對象
- 9. 在NSOperation中釋放對象
- 10. 在Java中釋放對象
- 11. 我是否需要刪除此對象?
- 12. 我是否需要刪除對象?
- 13. 約釋放對象在可可框架使用時KVO
- 14. 在插入新對象之前需要從列表中刪除對象?
- 15. 在Django中刪除子對象時刪除父對象
- 16. 我需要在C中刪除非託管對象++/CLI
- 17. 回收釋放對象
- 18. Javascript正在返回[對象對象],需要刪除
- 19. 是否需要釋放該對象?
- 20. 從對象數組中刪除對象
- 21. 從對象列表中刪除對象
- 22. 使用Objective C/Cocoa從NSDate對象中刪除時間組件
- 23. 在面向對象的編程中,我們需要抽象嗎?
- 24. Java,確保從arrayList中刪除對象時正在刪除對象
- 25. 我是否需要釋放從gtk_builder_get_object返回的對象?
- 26. 從鍵中移除對象後,我需要在NSUserDefaults中進行同步嗎?
- 27. 釋放對象內存中的對象
- 28. 在Android中從ArrayList中刪除對象
- 29. 使用免費刪除對象釋放內部對象
- 30. 需要刪除對象:實現在函數中處理或創建對象?
我可以從經驗中確認您將獲得無窮的崩潰,如果不刪除你的觀察員的痛苦。 – Jeff 2010-04-28 23:33:17
感謝您的詳細解釋! – 2011-08-31 10:56:52