我被KVC/KVO迷住了。超強大。但有一個問題。我試圖成爲真正的MVC etho,但我沒有辦法使用觀察模式來監視Objective-C類實例的分配或釋放。如何觀察對象實例的創建/銷燬?
這實際上很重要,因爲我有一個模型,它具有我想從控制器(或委託人)觀察到的細密內部消息傳遞。對我來說,絆腳石是我看不到模型外部的一個子組件如何在沒有控制器瞭解模型的內部邏輯的情況下釋放子組件,而這些子組件將會被釋放,從而危害封裝。
有人可以爲這種情況提出一種方法。
感謝, 道格
我被KVC/KVO迷住了。超強大。但有一個問題。我試圖成爲真正的MVC etho,但我沒有辦法使用觀察模式來監視Objective-C類實例的分配或釋放。如何觀察對象實例的創建/銷燬?
這實際上很重要,因爲我有一個模型,它具有我想從控制器(或委託人)觀察到的細密內部消息傳遞。對我來說,絆腳石是我看不到模型外部的一個子組件如何在沒有控制器瞭解模型的內部邏輯的情況下釋放子組件,而這些子組件將會被釋放,從而危害封裝。
有人可以爲這種情況提出一種方法。
感謝, 道格
道格 - 是不是真的有足夠的信息,在你的描述就知道這是你在做什麼以及如何最好地(或者它是否適合在所有)申請志願的問題。
KVO是關於觀察對象的屬性。除非在銷燬之前必須停止觀察它們,否則通常不應該在乎它們何時被創建或銷燬。
您應該在這些對象變得對您感興趣時啓動並停止觀察對象。考慮一個圖形繪製包,其中文檔具有有序的形狀數組,並且您有興趣觀察每個形狀的backgroundColor屬性。
我們不會試圖觀察實例化和形狀實例的釋放,而是我們觀察該文檔的「形狀」屬性。通過該觀察者,我們可以確定何時將圖形添加到文檔或從中刪除。當一個形狀被添加到文檔中時,我們開始觀察它。當它從文檔中刪除時,我們停止觀察它。 (請注意,它可能會從文檔中刪除,但不會釋放,如果它位於撤消堆棧等)
在模型的對象圖中,要使用KVO,您需要添加和刪除對象從符合KVO標準的對象圖中,您可以觀察關係突變,並在該觀察者中啓動和停止有關對象的屬性觀察器。
我認爲你必須自己發佈通知,除非你使用像CoreData。如果您使用的是CoreData,則NSManagedObject(所有存儲的CoreData對象的根類)具有-awakeFromInsert方法,該方法在創建對象並將其插入ManagedObjectContext後會被調用。
至於銷燬,您可能只需在輸入-dealloc方法時發佈通知即可。
我不確定你想要達到什麼目標,所以多一點解釋會很好。
如果您只是想在觀察對象被釋放之前移除觀察者,那麼請不要擔心,因爲KVO會處理它。即使您使用通知,也不會導致問題,您只會收到來自對象的任何通知。
如果您嘗試觀察多個對象(例如一個Widgets數組),並想知道何時添加或刪除對象,那麼KVO也可以處理該對象。您只需將陣列作爲模型對象的關鍵點,然後使用KVO觀察它。您還必須以符合KVO的方式修改陣列(例如mutableArrayForKey:或使用您自己的willChangeValueForKey和didChangeValueForKey)。
謝謝湯姆。非常有幫助。乾杯。 – dugla 2009-07-02 23:13:32
你釘了吉姆。 感謝您的澄清。我完全忽略了這樣一個事實,即它是指我應該觀察的實例本身而不是實例本身的實例。此外,使用點syntac - grandparent.parent.child - 我可以觀察對象圖中的任何內容。 我假設有觀察收藏品的KVO模式,是嗎? 2豎起大拇指。 -Doug – dugla 2009-07-02 23:11:58