回答

15

這兩個並不總是可以互換的。從概念上講,KVO僅用於觀察對象的屬性。例如,您不能使用KVO來替換NSApplicationWillTerminateNotification,因爲它通知觀察者有關發生的事件,而不是對象屬性的更改。

至於性能和內存使用情況,它們都很快並且使用的內存可以忽略不計。 NSNotificationQueue已合併停止通知洪水。就我所知,KVO沒有任何合併,這確實給我帶來了性能問題。我觀察了數百個對象,當這些對象發生批量更新時,我會得到數百個KVO回調。這不是KVO本身的性能問題,而是由於批量更新而導致我自己的代碼運行。

性能並不是真正的問題,它更多的是最適合這個問題。如果是屬性更改,請使用KVO。如果它不是屬性更改,則根據您是需要單個觀察者還是多個觀察者來使用委託或通知。

+1

啊。不知道通知的彙總。這對我來說是相當重要的。 – David

+2

通知最適用於不需要一個對象來了解某些特定其他對象的情況。例如,如果在應用程序中進行了一些設置更改,並且通知這些視圖不必知道管理保留MVC的設置的對象,則可能需要刷新一堆視圖。 –

0

一個非常古老的問題,但想到添加一些觀點。我同意Tom Dalling's answer,但是,在大型應用程序中有很多場景,我們傾向於爲對象的屬性添加觀察者,而我們不能,或者,我們錯過了將其從觀察者列表中刪除。

讓我們從我的應用程序中考慮以下情況 - ViewController顯示一個蛇對象,我正在觀察此對象上的屬性更改 - 「毒液」。所以無論viewController需要顯示不同的蛇,我只需從該蛇對象的觀察者中刪除視圖控制器。

該應用程序演變爲一個蛇列表,而不是一條蛇,這意味着我必須觀察該物體中所有蛇的屬性。現在,當一個老蛇從數組中移除時,我應該瞭解這個事件,以便我可以從這個蛇對象中移除視圖控制器作爲觀察者。要做到這一點,我必須首先觀察陣列本身的變化。爲此,我必須遵循特定的協議將對象插入到數組中,並將它們從數組中移除。這種複雜性依賴於此。我們都知道不從觀察對象中刪除觀察者以及該對象是否被操作系統釋放的後果!

以上只是一個例子舉,這裏的主要問題是我不能讓志願觀察員名單給定對象從觀察者刪除此對象得到釋放之前 - 這可以通過NSNotification並可以輕鬆實現NSNotificationCenter。有時,我傾向於使用NSNotification而不是KVO,但是,KVO總是在良好的設計實踐方面具有優勢。