有許多與這個主題相關的問題,但他們都沒有回答我的問題。關鍵值觀察對象被釋放時觀察removeObserver
我想removeObserver
從該對象獲取釋放時的對象。我正在使用KVO,因爲需要遵守多個項目,並且在這種情況下NSNotification
有巨大的開銷。
下面是情形:
(多)的對象由不同的其他對象觀察。當observer
被取消分配時,我可以將其作爲觀察者移除。但是當observed
得到釋放,我需要告訴所有observers
作爲觀察員自己刪除。這個怎麼做?
有許多與這個主題相關的問題,但他們都沒有回答我的問題。關鍵值觀察對象被釋放時觀察removeObserver
我想removeObserver
從該對象獲取釋放時的對象。我正在使用KVO,因爲需要遵守多個項目,並且在這種情況下NSNotification
有巨大的開銷。
下面是情形:
(多)的對象由不同的其他對象觀察。當observer
被取消分配時,我可以將其作爲觀察者移除。但是當observed
得到釋放,我需要告訴所有observers
作爲觀察員自己刪除。這個怎麼做?
當觀察到被取消分配時,您可以單獨發佈來自-(void)dealloc
的通知。在收到所有其他觀察員後,將刪除所需的通知。
如果對象(被觀察)被釋放,那麼該對象不能被改變,或者它的值不能被改變,所以如果你的觀察者正在觀察一個被釋放的對象並且被釋放的對象永遠不會發送任何類型的觀察通知然後有刪除觀察員的任何樂趣?編輯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~嘿,我從here得到了一些東西。這個想法是,你觀察到一個額外的屬性,如alive
,並在dealloc中寫入觀察值爲alive = NO;
,並且隨着此屬性更改,所有觀察者都會收到通知,因此您可以刪除所有觀察者。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在控制檯中看到此錯誤消息後,您想刪除Observer,即使它沒有樂趣:)。 'MyClass類的實例0xd89f200被釋放,而鍵值觀察者仍然註冊了它。觀察信息被泄漏,甚至可能被誤認爲是其他物體。「 – Sailesh 2012-01-31 10:18:06
嗯,這是一個嚴重的東西...讓我搜索,如果我能找到東西..感謝您的答覆:) – 2012-01-31 10:24:57
我編輯了答案... 。 – 2012-01-31 10:39:56
我認爲這裏有一個設計問題。觀察對象不應該關心它的觀察者。你說你想從觀察對象的dealloc方法中移除觀察者。但爲什麼它會被釋放?如果仍然觀察到某個地方存在所有權,則該對象不會被處理。在dealloc被調用的時候,沒有觀察者留下好的設計結果。
想象一下,將自己註冊爲模型對象的觀察者的視圖。該模型對象被保留在視圖中或控制器中。只要它保留在某個地方,模型對象就不會調用它的dealloc。只有當最後一個所有權被釋放時,它應該調用dealloc。所以說,所有的所有權都被釋放,除了view/viewcontroller和剩下一個觀察者(視圖)。現在,在視圖/視圖控制器釋放對模型對象的所有權之前,它還應該以觀察者身份移除視圖。所以在調用dealloc方法時,應該沒有觀察者留下。
不會有這麼多的通知,並且使用kvo的全部目的被擊敗。而且,它最終會變成:1.觀察對象的某些屬性。 2.從所有觀察對象中,釋放時發出通知。 3.聽取釋放通知並移除觀察者。這是很多工作。是不是有一些乾淨的解決方案? – Sailesh 2012-01-31 09:18:34