KVO or Notification?

2009/09/21 at 08:24 コメントをどうぞ


Cocoaにはある値の変更、あるイベントの通知を行うために仕組みがいくつか存在し、その中にはKey Value Observation(以降KVOと称する)とNSNotificationCenterを利用した通知があります。

問題はこれらをいつ、どう選んで使うかだと思いますが、私はKVOをInterfaceBuilderでxibに格納したArrayControllerの値を監視しその変化を別のグラフに反映する形で使っていました。が、これが原因になってアプリケーションが停止してしまうことが往々発生しました。ViewControllerも使っていますがビューをスイッチする際にどうかObserverが残ってしまい後でそのビューに戻る際に謝ったメモリへのアクセスによるエラーが発生するのです。

回避策としてObjserverのdeallocメソッドの中でremoveObserverを行うことも試してみましたがこれもだめでした。どうやらremoveObserverの呼び先のオブジェクトが既にメモリから解除されている様子です。

それで気づいたのが、KVOでは通知元と通知先のオブジェクトがかなり密に結合してしまうってことです。まあ、回避策としていくつかウェブに乗ってはいましたものの、実装が細かくなるのであまり適切とは思われず、結局、通知元と通知先の間にNotificationCenterを介在させることで疎結合の状態にすることがベストだと思いました。

じゃあ、KVOはどんな場合に使えばいいでしょうか?そこまでは詳しく調べてないですが、今考えているのは以下の通りです。

・お互いのライフサイクルをちゃんと把握しており、しかもそれらの制御が可能である場合
・シングルスレッド、同期処理のみで問題ない場合(NSNotificationを使うと非同期処理も出来ます。)

うむ。今はこれくらいでしょうか?他にもっと考慮しないと行けないことがあるかも知りませんが、当面の問題は解決したので一旦ここまで。

広告

Entry filed under: Cocoa is ....

要は、どれくらい集中するかではないか? Cocoa開発者の役に立つサイト

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

w

%s と連携中

Trackback this post  |  Subscribe to the comments via RSS Feed


カレンダー

2009年9月
« 8月   10月 »
 123456
78910111213
14151617181920
21222324252627
282930  

Most Recent Posts


%d人のブロガーが「いいね」をつけました。