2

私はこれに混乱しています: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174-178830-BAJEDEFB

仮定すると

@interface Office : NSObject {
  NSMutableArray *employees;
}
  1. コレクション アクセサーを実装する利点は何ですか?

  2. よりもどのように[anOffice countOfEmployees]優れてい[[anOffice employees] count]ますか?

  3. バインディングはコレクション アクセサーに依存しますか、それとも完全に無視できますか? 私は真の配列オブジェクトを使用しているので、冗長に見えます。従業員がそうではなく、NSMutableArrayカウントメソッド自体のようなものを実装していない場合、それらがどのように必要になるかを理解できます。

  4. mutableArrayValueForKey:@"employees"また、単に の代わりに employees プロパティを取得するために使用する理由にも完全に困惑していますvalueForKey:@"employees"

ありがとう!

4

1 に答える 1

3

コレクション アクセサーを省略できます。それらは必須ではありません。しかし、それらは物事をずっと簡単にします。

を含むそれらを持つ理由の 1 つcountOfEmployeesは効率です。employeesメソッドは配列オブジェクトのコピーを返す場合があります (特に Office のコピーは変更可能であるため、Office は他のオブジェクトが配列をその下から変更することを望んでいません)。カウントを知る必要があるか、特定のインデックスで 1 つのオブジェクトにアクセスするだけでよく、コピーは必要ありません。

もう 1 つの理由は、送信者がプロパティを変更したい場合です。

  • valueForKey:employees通常、不変のコピーを返します。
  • その配列を変更すると、プロパティを介してオリジナルではなくコピーが変更されるため、変更可能なコピーを返すことは役に立ちません。
  • 元の配列を返すと、送信者はその変更について KVO 通知を発生させることができないため、プロパティを監視するものはそれらの変更を認識しません。これは、UI に表示される値が古くなる (更新されない) ことを意味します。

mutableArrayValueForKey:employees元のオブジェクトにミューテーション メッセージ (または、他に何もない場合はsetEmployees:メッセージ) を送信する偽の配列を返します。アクセサー メッセージによって KVO 通知が発生するため、プロパティを監視するものはすべてこれらの変更に従っているため、UI は最新の状態に保たれます。

もちろん、アクセサ メッセージを自分で送信することもできます。mutableArrayValueForKey:主に、コンパイル時に不明なプロパティに変更を加えたい場合に使用します。NSArrayController は、おそらく、このメソッドの 1 つのユーザーです。通常のアプリケーションで使用する必要はほとんどなくmutableArrayValueForKey:、アクセサ メッセージを自分で送信する方が読みやすいと思います。

独自の配列を変更する場合、これはすべて Office にも当てはまります。配列オブジェクトと直接対話することもできますが、KVO 通知は発生しないため、プロパティの値が変更されたことは他にはわかりません。変更ごとに KVO 通知を自分で投稿することもできますが、これは手間がかかり、忘れがちです。コレクション アクセサーとmutableArrayValueForKey:は、これらの問題に対する 2 つの解決策です。各アクセスは、KVO 通知を引き起こす 1 行のコードです。

于 2010-08-23T03:52:57.450 に答える