2011-12-04 6 views
1

@synthesizeで生成されたセッターはKVCコンパイラであるかどうか?ゲッターとセッターがKVCに準拠しているという声明がありましたが、このメソッドの1つを呼び出すべきではありませんか?@synthesizedプロパティとKVC

@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 

としてそれをテスト:KVOのために:

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

答えて

8

は、私はあなたがラウンドそれを間違った方法を持っていると思います。.. KVC -setValue:forKey:ビーイングKVC準拠を呼び出しますアクセサが-setValue:forKey:を呼び出すと、アクセサを呼び出しますことを意味していることを意味するものではありません準拠しています。ビットを拡大

KVCは唯一の手段 'が規則命名以下の' 準拠しました。何でこれが大切ですか?私はアクセサーメソッドを好きなものに呼び出すことができます。プロパティ 'Foo'の場合:

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

これは問題ありません。しかし、バインディングのようなメカニズムは、我々はsetterメソッドを書いた場合、我々はそれを使用したいので、それは右、です(正しいことをしようとアクセサメソッドを使用します

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

-setValue:forKey:を呼び出すことではFooを設定しようとします?)。しかし、セッターメソッドの名前を標準-setFoo:としないと、それが見つからないでしょう。

したがって-weakSetFoo:はセッターメソッドですが、プロパティFooはKVCに準拠していません。 セッターの名前を-setFoo:に変更すると、プロパティFooがKVCに準拠しました。

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

2

あなたはsetValueForKeyを実装する必要はありません。これはフレームワーク内で実装されています。あなたの特性(あなたは@propertyと@synthesizeを使用して行われている)KVO準拠することにより、すべてがちょうど「魔法の作品

-----更新

また、あなたのテストコードはKVOをテストしていないでしょう。テストするには、次のような操作を行います。

testing *t = [[testing alloc] init]; 
[t setValue:@"55555555" forKey:@"phone"]; 
+0

私はsetterを生成するステートメントはKVOコンパイルであるため、これはsetValueではなくsetterを使用する理由です。私はsetValueを呼び出すことは知っていますが、生成されたsetterを呼び出すと、 "testing"でsetValueが呼​​び出されません。 – Marcin

2

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

@synthesize propertyと書くと、コンパイラは実際には- (type) property- (void) setProperty: (type)valueの種類の対応するインスタンス変数を読み込み/設定することになります。

関連する問題