2013-12-22 47 views
0

使用NSNotificationCenter object時,如果添加通知的觀察者,You must invoke removeObserver: or removeObserver:name:object: before any object specified by addObserverForName:object:queue:usingBlock: is deallocated如何確保removeObserver不帶子類並重寫dealloc?

有沒有辦法做到這一點,而無需繼承對象並重寫「dealloc」?如果我可以避免使用通知,我不希望爲一些對象創建子類。有沒有其他方法可以在發生之前瞭解dealloc?

感謝您的幫助。

+1

你如何做到這一點取決於對象是什麼,以及它們如何被釋放。你可以更具體地瞭解你想要做什麼? – rdelmar

+0

該對象只是一個UIView,在評估過程中會根據需要進行分配和釋放。當它的視圖控制器被銷燬時,它可能會被釋放,或者它可能會更早發生。 – Colen

+0

如果它發生得更早,它是如何釋放的?你不能在任何地方調用removeObserver來解除分配視圖嗎? – rdelmar

回答

0

一般來說,你應該考慮什麼對象正在觀察變化並使之適當。這通常意味着一個控制器類,在這種情況下,您通常已經擁有一個自定義子類。它通常應該接收觀察回調並根據需要轉發它們。它應該作爲觀察者在創建/銷燬/放置/從顯示中移除時添加和移除。

也就是說,如果你做的任意類觀察家堅持,這裏有一個想法(我認爲它應該是安全的,但我不想依賴它):

您可以使用一個自定義類以處理觀察員的移除。這應該是一個配置了要刪除的類的引用的類。在配置方法期間,此類將其自身添加到要使用objc_setassociatedobjectOBJC_ASSOCIATION_RETAIN刪除的類中,並將指針存儲在NSValue中,以便將其刪除。然後,在解除分配時,使用NSValue從通知中心刪除其他課程。