16

Objective-C 2.0 以降、自動生成された@propertiesアクセサ メソッドがありました。では、今日のキー値コーディングのポイントは何ですか? どのような状況で書くのが好ましいか

[myObject setValue:foo forKey:@"bar"];

書く代わりに

[myObject setBar:foo];

あるいは

myObject.bar = foo;

KVC を使用する記事やドキュメントをよく目にしますが、常に単にプロパティを使用する方がよいように思われます。では、なぜ KVC を使用するのでしょうか。あらゆる洞察に感謝します。

4

3 に答える 3

24

[myObject setValue:foo forKey:@"bar"]リテラルを使用して手で書き出すことは、ほとんど決して好ましいことではありません@"bar"。実行時までアクセスしたいプロパティがわからない場合、通常は KVC を使用してプロパティにアクセスします。

1 つの例は、xib のアウトレットです。テキスト フィールドのデリゲート アウトレットを xib のファイルの所有者に接続すると、xib は接続を 3 つのフィールドを持つオブジェクトとして記録します。

  • テキストフィールドへの参照 (アウトレットを持つオブジェクト)
  • ファイルの所有者のプレースホルダー (接続先) への参照
  • 文字列としてのアウトレットの名前、@"delegate"

実行時に、xib ローダー (UIKit フレームワークの一部) はテキスト フィールドを逆シリアル化します。次に、接続オブジェクトを逆シリアル化し、それを使用して、xib で配線した接続を確立します。xib ローダーは、テキスト フィールドのプロパティ (delegateプロパティ) を設定する必要がありますが、アプリと UIKit フレームワークの両方がコンパイルされてからずっと後の実行時に xib をロードするまで、どのプロパティかはわかりません。

実行時までアクセスするプロパティがわからない別の例は、CALayerサブクラスのカスタム プロパティをアニメーション化する Core Animation の (ほとんど知られていない) 機能です。という名前のプロパティを持つ、CALayercalledのサブクラスを作成するとします。標準を使用してプロパティをアニメーション化できます。PolygonLayersidessidesCABasicAnimation

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sides"];
animation.fromValue = @3;
animation.toValue = @9;
animation.autoreverses = YES;
animation.duration = 1;
[myPolygonLayer addAnimation:animation forKey:@"sides"];

sidesPresto、Core Animation は、レイヤーのプロパティを 3 から 9 へとアニメーション化します。sidesしかし、Core Animation のソース コードは、プロパティについて何も知りません。(詳細については、この質問を確認してください。)

コンパイル時にプロパティを知っていても、KVC を使用することがあります。1 つの例は、KVC が行ってくれる余分な作業を利用したい場合です。たとえば、NSArrayたくさんのPersonオブジェクトがあり、すべての人物の名の配列を取得したい場合、次のように記述できます。

NSMutableArray *firstNames = [NSMutableArray array];
for (Person *person in people) {
    [firstNames addObject:person.firstName];
}

しかし、これは KVC がよりシンプルにする機能を備えている場合です。KVC を使用して配列のプロパティにアクセスすると、KVC は実際には配列内のすべての要素のそのプロパティにアクセスします。

NSArray *firstNames = [people valueForKey:@"firstName"];

コンパイル時にプロパティがわかっている場合でも KVC を使用する可能性がある別の例は、プロパティがクラスの一部として静的に宣言されていない場合です。たとえば、各 NSManagedObject (コア データの一部) は、そのインスタンスNSManagedObjectが表しているエンティティに基づいて、自身に動的にプロパティを与えます。KVC を使用してこれらのプロパティにアクセスできますが、通常はのサブクラスNSManagedObjectまたは のカテゴリでNSManagedObject宣言することをお勧めします。

于 2012-11-14T19:58:12.040 に答える
0

KVC は、キー値オブザーバーを使用してオブジェクトの値の変化を検出する場合に役立ちます。KVO を使用したい場合、@propertiesすべてのミューテーター メソッドを次のようにラップする必要があります。

[self willChangeValueForKey:@"bar"];
bar = foo;
[self didChangeValueForKey:@"bar"];
于 2012-11-14T19:55:44.923 に答える
0

実行時まで、設定/取得するプロパティがわからない場合があります。
この場合、プロパティ キー パスを文字列として作成することにより、KVC を使用できます。

たとえば、複数の NSArray プロパティを持つオブジェクトがあり、それらが更新された最後の NSDate を保持したいとします。

私がという配列プロパティを持っているとしましょう: commentsと呼ばれる配列プロパティとlikes

プロパティを定義します: commentsLastModified と likesLastModified です。配列が更新されると(プロパティ名が文字列になっている)、次を使用します。

[object setValue:[NSDate date] forKey:[NSString stringWithFormat:@"%@%@", arrayString, @"LastModified"];
于 2012-11-14T20:06:46.077 に答える