1

@synthesizeで生成されたセッターはKVC準拠である必要がありますか?生成されたゲッターとセッターはKVCに準拠しているというステートメントを見つけましたが、このメソッドの1つを呼び出すべきではありませんか?

@interface testing : NSObject
@property (nonatomic, retain) NSString *phone;
@end

実装:

@implementation testing
@synthesize phone;

- (id)init {
    self = [super init];
    return self;
}

// none of these is called with dot syntax, or setter setPhone
- (void)setValue:(id)value forKey:(NSString *)key
{
    NSLog(@"%@",key);
    [super setValue:value forKey:key];
}

-(void)setValue:(id)value forKeyPath:(NSString *)keyPath
{
    NSLog(@"%@",keyPath);
    [super setValue:value forKeyPath:keyPath];
}

@end

そしてそれをテストします:

testing *t = [[testing alloc] init];
[t setPhone:@"55555555"];
4

3 に答える 3

8

私はあなたがそれを間違った方法で持っていると思います..KVC準拠は、アクセサが呼び出すことを意味しません-setValue:forKey:KVC準拠であることは、呼び出しがアクセサを呼び出すことを意味し-setValue:forKey:ます。

少し拡張:KVC準拠とは、「命名規則に従う」ことのみを意味します。何でこれが大切ですか?アクセサメソッドは好きなように呼び出すことができます。プロパティ'Foo'の場合:

- (void)weakSetFoo:(id)f;
- (id)autoreleasedFoo;

これで結構です。しかし、Bindingsのようなメカニズムは、を呼び出すことによってFooを設定しようとします

[ob setValue:newVal forKey:@"foo"];

-setValue:forKey:正しいことを実行し、アクセサメソッドを使用しようとします(セッターメソッドを作成した場合、それを使用したいからですよね?)。しかし、セッターメソッドに標準という名前を付けない限り、-setFoo:それを見つける方法はありません。

セッターメソッドもそう-weakSetFoo:ですが、プロパティFooはKVCに準拠していません。セッター名を-setFoo:プロパティに変更すると、FooはKVCに準拠するようになります。

合成されたアクセサメソッドは、デフォルトで正しく名前が付けられます。

于 2011-12-04T22:31:44.597 に答える
2

KVO用にsetValueForKey:を実装する必要はありません。フレームワーク内に実装されます。プロパティをKVOに準拠させる(@propertyと@synthesizeを使用して行った)ことにより、すべてが「魔法のように」機能します。

- - - アップデート

また、テストコードはKVOをテストしません。それをテストするには、次のようなことを行います。

testing *t = [[testing alloc] init];
[t setValue:@"55555555" forKey:@"phone"];
于 2011-12-04T22:20:39.477 に答える
2

それは実際には逆です。これらはsetValue:forKeygetValueforKeyKVC準拠のプロパティを検索するものであり、それらを介して合成されたプロパティではありません。

@synthesize propertyコンパイラを作成するときは、実際には、対応するインスタンス変数を読み取ったり設定したりするだけの方法があります- (type) property- (void) setProperty: (type)value

于 2011-12-04T22:25:16.213 に答える