2012-01-31 129 views
6

有許多與這個主題相關的問題,但他們都沒有回答我的問題。關鍵值觀察對象被釋放時觀察removeObserver

我想removeObserver從該對象獲取釋放時的對象。我正在使用KVO,因爲需要遵守多個項目,並且在這種情況下NSNotification有巨大的開銷。

下面是情形:

(多)的對象由不同的其他對象觀察。當observer被取消分配時,我可以將其作爲觀察者移除。但是當observed得到釋放,我需要告訴所有observers作爲觀察員自己刪除。這個怎麼做?

回答

1

當觀察到被取消分配時,您可以單獨發佈來自-(void)dealloc的通知。在收到所有其他觀察員後,將刪除所需的通知。

+0

不會有這麼多的通知,並且使用kvo的全部目的被擊敗。而且,它最終會變成:1.觀察對象的某些屬性。 2.從所有觀察對象中,釋放時發出通知。 3.聽取釋放通知並移除觀察者。這是很多工作。是不是有一些乾淨的解決方案? – Sailesh 2012-01-31 09:18:34

3

如果對象(被觀察)被釋放,那麼該對象不能被改變,或者它的值不能被改變,所以如果你的觀察者正在觀察一個被釋放的對象並且被釋放的對象永遠不會發送任何類型的觀察通知然後有刪除觀察員的任何樂趣?編輯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~嘿,我從here得到了一些東西。這個想法是,你觀察到一個額外的屬性,如alive,並在dealloc中寫入觀察值爲alive = NO;,並且隨着此屬性更改,所有觀察者都會收到通知,因此您可以刪除所有觀察者。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+2

在控制檯中看到此錯誤消息後,您想刪除Observer,即使它沒有樂趣:)。 'MyClass類的實例0xd89f200被釋放,而鍵值觀察者仍然註冊了它。觀察信息被泄漏,甚至可能被誤認爲是其他物體。「 – Sailesh 2012-01-31 10:18:06

+0

嗯,這是一個嚴重的東西...讓我搜索,如果我能找到東西..感謝您的答覆:) – 2012-01-31 10:24:57

+0

我編輯了答案... 。 – 2012-01-31 10:39:56

2

我認爲這裏有一個設計問題。觀察對象不應該關心它的觀察者。你說你想從觀察對象的dealloc方法中移除觀察者。但爲什麼它會被釋放?如果仍然觀察到某個地方存在所有權,則該對象不會被處理。在dealloc被調用的時候,沒有觀察者留下好的設計結果。

想象一下,將自己註冊爲模型對象的觀察者的視圖。該模型對象被保留在視圖中或控制器中。只要它保留在某個地方,模型對象就不會調用它的dealloc。只有當最後一個所有權被釋放時,它應該調用dealloc。所以說,所有的所有權都被釋放,除了view/viewcontroller和剩下一個觀察者(視圖)。現在,在視圖/視圖控制器釋放對模型對象的所有權之前,它還應該以觀察者身份移除視圖。所以在調用dealloc方法時,應該沒有觀察者留下。

+0

考慮兩個對象相互觀察的情況。您建議的設計會創建一個保留週期。無論如何,考慮到應用程序的所有其他方面,觀察者可能只會對觀察到的參照物產生較弱的參考,否則可能不是一個好設計。 – Sailesh 2012-01-31 10:21:37

+1

在我看來,兩個觀察對象是一個糟糕的設計。 – 2012-01-31 10:41:41

+0

感謝您的回答。我意識到,我對模型擁有較弱所有權的決定是錯誤的。現在我轉向了一種強大的關係,希望我現在看不到很多KVO崩潰。 – rounak 2014-12-28 19:54:34