1

Cocoa と Objective-C の初心者として、私は KVC と KVO について基本的な理解を持っています。ただし、Cocoa Bindings に関しては (「Cocoa Bindings Programming Topics」というタイトルの Apple ドキュメントで説明されているように、図 8 ~ 10 を参照してください)、KVO で十分と思われるのに、なぜ KVC と KVO の両方を使用して描かれているのかわかりません。KVO の ObserveValueForKeyPath:ofObject:change:context は古い値と新しい値を提供できるのに、なぜ KVC メカニズムが必要なのですか? KVO がどのようにオブジェクトを分離するかはわかりますが、KVC もそうです。

Apple が提供する例 (図 8 ~ 10) は、「温度」、コントローラー オブジェクト、および温度プロパティを持つモデル オブジェクトを設定および表示するためのユーザー操作を視覚的に表現して許可するスライダーとテキスト入力コントロールを含むウィンドウを示しています。別の言い方をすれば、私の質問は、なぜ 2 つのコントロールとコントローラーの間で双方向の KVO 関係 (それぞれがオブザーバーとして互いに登録する) と、モデル オブジェクトとコントローラーの間の双方向の KVO 関係を持たないのかということです。なぜ KVC が必要なのですか?

4

2 に答える 2

2

長々としたドキュメントはあなたを混乱させます。

これが行うことは、コードの再利用性に関することだけです。

(1) プロパティを宣言および管理する標準的な方法を提供します。(ivar と setter と getter を使用して古い方法で手動で行うことができますが、プロパティ合成では無料で提供されます)

規則に従わない限り、キーと値のペアを確実に観察することはできません。コンベンションはKVCです。それに続いて、KVC に準拠しています。

(2) オブジェクトが別のオブジェクトのプロパティへの変更に関する通知を受け取るための高度に再利用可能で一般的な方法を提供します。KVOです。KVO は、最初に KVC に準拠するプロパティの変更に基づいて、通知を一般的にコーディングする機能です。

(3) バインディングとコア データ。どちらのテクノロジーも KVC と KVO に基づいて構築されており、これを可能な限り一般的な方法で機能させます。

また、Active Record や Ruby on Rails などの ORM と概念的に非常に似ています。魔法は KVC から始まります。KVC は単純な KVO メカニズムを有効にします。KVO + KVC は、バインディングとコア データを可能かつ簡単にします。また、多くのシンタックス シュガーと奇抜な便利機能も提供します。KVC 準拠オブジェクトへのインターフェイスは、辞書または配列として扱うことができます。その後、すべてのパターンが所定の位置に収まります。

他の双方向オブザーバー パターンを使用することもできます。委任 (お互いを委任として設定するか、委任を共有する) と通知 (NSNotification を介して)、または単に他のオブジェクトにメッセージを送信する (これがどこでもパターンである場合、密結合が悪く、これらの他のパタ​​ーンが作成される可能性があります) これらは間違っていませんが、いくつかのトレードオフ。

通知はスパゲッティ コードになる場合があります。すべてのコールバックと同様に、goto のような結果になることがあります。ただし、KVO のような特定のオブジェクトの特定のプロパティと密接に結び付いているとは限りません。さまざまなことが含まれる可能性のある非常に一般的な通知を待っているだけです。ただし、その性質上、通知はユース ケースに特化したものになる傾向があり、カスタム シナリオに簡単に適用できます。

KVO as-a-specific-technology は KVC 規約に基づいて構築されており、規約なしでは機能しません。これにより、非常に基本的で一般的な定型コードと密結合の作成が容易になります。

于 2013-06-21T04:06:25.180 に答える
1

コメントでいくつか試してみましたが、彼は私の行く人です:

KVO は基本的に KVC の上に構築されます。オブザーバーがある場合に KVC 準拠のプロパティが変更されると、KVO 機構が作動し、必要に応じて情報辞書を構築し、メッセージをオブザーバーに送信します。

彼らがなぜこのように行われたのか、なぜ別の方法で行わなかったのかを質問する場合、それは別の質問です. KVO は何かにプラグインする必要があります。単純な方法で変数 (メモリの場所) の変更を観察することはできません [*]。セッターとゲッターを持つプロパティは、KVO などをフックできる場所です。プロパティは KVC パターンに従い、それをサポートする機械は既に存在します...しかし、KVOKVC に依存しなければならないという意味ではありません。他の実装戦略は間違いなく可能です。

少しHTH。

[*] デバッグ モードに入り、ウォッチポイントを展開することは、このコンテキストでは「単純」ではありません。

于 2013-06-21T03:38:45.057 に答える