AppController.h:
@interface AppController : NSObject
{
int fido;
}
@property (readonly, assign) int fido;
@end
「AppController.h」をインポート
@implementation AppController
@synthesize fido;
...
@end
この時点で、AppController に-fido
メソッドがあることが宣言され、そのメソッドが合成されました。方法はありません-setFido:
。では、なぜ次の「動作」するのでしょうか。
- (id)init
{
if (self=[super init]) {
[self setValue:[NSNumber numberWithInt:5] forKey:@"fido"];
NSNumber *n = [self valueForKey:@"fido"];
NSLog(@"fido = %@", n);
}
return self;
}
(ところで:正しいパターンを実装するために -init を修正しました)
これが機能するのは、KVC がヒューリスティックに従って値を設定または取得するためです。への呼び出しは、-setValue:forKey:
最初に を探し-setFoo:
ます。見つからない場合は、インスタンス変数foo
を探して直接設定します。
インスタンス変数fido
を に変更する_fido
と、セットは機能 valueForKey
しますが、合成されたメソッドを呼び出すと 0 が返されることに注意してください (私は 64 ビットを使用しているため、@synthesize はfido
インスタンス変数を合成します。紛らわしいことはわかっています)。
ivar の名前を に変更してからbar
を使用する@synthesize foo=bar;
と、コードは実行時に失敗します。
わかるでしょ:
2009-10-01 08:59:58.081 dfkjdfkjfjkfd[24099:903] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppController 0x20000e700> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fido.'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff85b055a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff85c5a0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff85b5caf9 -[NSException raise] + 9
3 Foundation 0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
(
0 CoreFoundation 0x00007fff85b055a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff85c5a0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff85b5caf9 -[NSException raise] + 9
3 Foundation 0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
4 dfkjdfkjfjkfd 0x0000000100000d96 -[AppController init] + 130