4

私はKVC/KVOに夢中です。超強力。ただし、1つの問題があります。私はMVCエトを真にしようとしていますが、Objective-Cクラスインスタンスの割り当てまたは割り当て解除を監視するために観測パターンを使用する方法がわかりません。

これは実際に重要です。コントローラー(またはデリゲート)から監視したい、きめ細かい内部メッセージングを備えたモデルがあるからです。私にとっての障害は、モデルの外部で、カプセル化を危険にさらすモデルの内部ロジックをコントローラーが知らなくても、割り当てが解除されようとしているサブコンポーネントのオブザーバーを削除する方法がわからないことです。

誰かがこのシナリオのアプローチを提案できますか?

ありがとう、ダグ

4

3 に答える 3

6

ダグ-説明には、自分が何をしているのか、問題にKVOを適用するのに最適な方法(または適切な場合)を知るのに十分な情報がありません。

KVOは、オブジェクトのプロパティを監視することを目的としています。それらが破壊される前にそれらを観察するのをやめなければならない場合を除いて、通常、それらがいつ作成または破壊されるかを気にする必要はありません。

代わりに、オブジェクトが興味を持ったときに、オブジェクトの観察を開始および停止する必要があります。ドキュメントに図形の順序付けられた配列があり、各図形のbackgroundColorプロパティを観察することに関心があるグラフィックス描画パッケージについて考えてみます。

Shapeインスタンスのインスタンス化と割り当て解除を監視しようとはしませんが、代わりにドキュメントの「shapes」プロパティを監視します。そのオブザーバーを通じて、図形がドキュメントに追加されたとき、またはドキュメントから削除されたときを判断できます。ドキュメントに図形が追加されると、それを観察し始めます。ドキュメントから削除されると、監視を停止します。(元に戻るスタックにある場合など、ドキュメントから削除される可能性がありますが、割り当てが解除されないことに注意してください。)

モデルのオブジェクトグラフで、KVOを使用するには、KVOに準拠した方法でオブジェクトグラフにオブジェクトを追加および削除して、関係の変化を観察できるようにします。そのオブザーバーでは、プロパティオブザーバーを開始および停止します。関連するオブジェクト。

于 2009-07-02T22:46:15.530 に答える
1

CoreDataのようなものを使用しない限り、通知を自分で投稿する必要があると思います。CoreDataを使用している場合、NSManagedObject(保存されているすべてのCoreDataオブジェクトのルートクラス)には、オブジェクトが作成されてManagedObjectContextに挿入された後に呼び出される-awakeFromInsertメソッドがあります。

破棄に関しては、-deallocメソッドを入力すると、通知をすぐに投稿できる可能性があります。

于 2009-07-02T22:35:45.550 に答える
0

何を達成しようとしているのか正確にはわからないので、もう少し説明しておくとよいでしょう。

監視対象オブジェクトの割り当てが解除される前にオブザーバーを削除するだけの場合でも、KVOが処理するため、心配する必要はありません。通知を使用している場合でも、問題は発生しませんが、オブジェクトから通知を受信することはありません。

複数のオブジェクト(ウィジェットの配列など)を監視しようとしていて、オブジェクトがいつ追加または削除されたかを知りたい場合は、KVOもそれを処理できます。配列をモデルオブジェクトのキーにして、KVOで観察するだけです。また、KVO準拠の方法で配列を変更する必要があります(たとえば、mutableArrayForKey:、または独自のwillChangeValueForKeyとdidChangeValueForKeyを使用します)。

于 2009-07-02T22:43:09.997 に答える