KVOとNSNotificationCenterの観測でどちらか一方を使用する理由があるのではないかと思います。パフォーマンス、メモリ使用量、速度など?
2 に答える
この2つは常に互換性があるとは限りません。概念的には、KVOはオブジェクトのプロパティを監視するためだけのものです。たとえば、KVOを使用して置換することはできませんNSApplicationWillTerminateNotification
。これは、オブジェクトのプロパティの変更ではなく、発生しているイベントについてオブザーバーに通知するためです。
パフォーマンスとメモリ使用量に関しては、どちらも高速で、使用するメモリはごくわずかです。NSNotificationQueue
通知の洪水を止めるために合体しています。私の知る限り、KVOには合体がありません。これは、ある時点でパフォーマンスの問題を引き起こしました。私は何百ものオブジェクトを観察していましたが、それらのオブジェクトにバッチ更新が発生すると、何百ものKVOコールバックが発生しました。これは、KVO自体のパフォーマンスの問題ではなく、バッチ更新の結果として実行されている自分のコードの問題でした。
パフォーマンスは実際には問題ではなく、問題に最適であることが重要です。プロパティの変更の場合は、KVOを使用してください。プロパティの変更でない場合は、単一のオブザーバーが必要か複数のオブザーバーが必要かによって、デリゲートまたは通知を使用します。
非常に古い質問ですが、いくつかのポイントを追加することを考えました。Tom Dallingの回答に同意しますが、大規模なアプリケーションでは、オブジェクトのプロパティにオブザーバーを追加する傾向があり、オブザーバーのリストからオブザーバーを削除できない、または削除できないシナリオが数多くあります。
私のアプリケーションから次のシナリオを考えてみましょう-ViewControllerはヘビオブジェクトを表示します。私はこのオブジェクトのプロパティの変更を観察しています-"venom"。したがって、viewControllerが別のヘビを表示する必要があるときはいつでも、そのヘビオブジェクトのオブザーバーからビューコントローラーを削除するだけです。
アプリは、単一のヘビではなくヘビのリストを表示するように進化しました。これは、そのオブジェクト内のすべてのヘビのプロパティを監視する必要があることを意味します。さて、古いスネークが配列から削除されたら、このスネークオブジェクトからオブザーバーとしてのView Controllerを削除できるように、このイベントについて知る必要があります。これを行うには、最初にアレイ自体の変更を監視する必要があります。これを行うには、特定のプロトコルに従ってオブジェクトを配列に挿入し、配列から削除する必要があります。このようにして、複雑さが増します。オブジェクトからオブザーバーを削除しないことの結果と、そのオブジェクトがOSによって解放されるかどうかは誰もが知っています。
上記は引用する一例にすぎません。ここでの主な問題は、特定のオブジェクトのKVOオブザーバーのリストを取得して、このオブジェクトが解放される前にオブザーバーから削除できないことです。これは、NSNotificationとNSNotificationCenterによって簡単に実現できます。時々、私はKVOよりもNSNotificationを使用する傾向がありますが、KVOは、優れた設計手法の観点から、常に通知よりも優れています。