1

iOSドキュメントでKVC準拠を読み取る場合。クラスをテストしようとしました。KVCクラスは準拠していますか?

しかし、私はいくつかの質問があります:

  1. プロパティ「Name」、「Age」のセッターはなく、クラスは引き続きエラーなしでKVCを使用しており、例外は発生しません。

  2. プロパティのセッターが作成されていない場合、コンパイラーは何をしますか?セッターとゲッターのペアを作成しますか?

    Person.h

    @interface Person : NSObject
    {
        NSString *name;
        NSInteger age;
    }
    

    Person.m

    @implementation Person
    
    - (id)init
    {
        self = [super init];
        if (self) {
            name = @"Duc Nguyen";
            age = 10;
        }
        return self;
    }
    

    ViewController.m

    - (IBAction)showKeyKVC:(id)sender {
        //--test kvc
        name1.text = [person valueForKey:@"name"];
        age1.text = [NSString stringWithFormat:@"%@", [person valueForKey:@"age"]];
    }
    

ボタンを押すと、結果は次のようになります。年齢:10、名前:DucNguyen。この場合、クラスがKVCをどのように使用できるかわかりませんか?

4

1 に答える 1

4

答えは、単純な属性KVC ガイドのアクセサー検索パターンにあります。

setValue:forKey のデフォルトの検索パターン:

プロパティに対してのデフォルトの実装setValue:forKey:が呼び出されると、次の検索パターンが使用されます。

  1. レシーバーのクラスで、名前が pattern に一致するアクセサー メソッドが検索されますset<Key>:
  2. アクセサーが見つからず、レシーバーのクラス メソッドが をaccessInstanceVariablesDirectly返した場合、レシーバーは、パターン、、、またはの順序YESで名前が一致するインスタンス変数を検索します。_<key>_is<Key><key>is<Key>

デフォルトの実装ではaccessInstanceVariablesDirectlyメソッドに YES が返されるため、KVC メカニズムは実際にはnameおよびageインスタンス変数から値を取得しています。

于 2013-07-06T06:33:05.140 に答える