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;
}
:KVCは値を設定または取得するヒューリスティックを以下のため、この作品
を(ところで、私は正しいパターンを実装するためにあなたの-initを固定)。 -setValue:forKey:
への呼び出しは、最初に-setFoo:
を探します。見つからなければ、インスタンス変数foo
を探し、それを直接設定します。あなたはfido
_fido
への変数のインスタンスを変更した場合、セットは動作しますが、私は64ビットの上だので、それは(合成されたメソッドを呼び出すようvalueForKey
は0を返すこと
が
注意、@synthesizeはfido
インスタンス変数を合成します混乱して、私は知っている)。
イヴァールの名前を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
また、+(BOOL)accessInstanceVariablesDirectly {return NO; }このKVCの振る舞いを排除するには – sbooth
良い点といい習慣があります。ありがとう! – bbum
偉大な答え、ありがとう。私がこの質問をしてきたのは、この章の主なポイントの1つは、KVCがセッターとゲッターを使用していることでした。私はそれが彼らが働く唯一の方法だと思っていた。 initスタイルは、彼が本で使用するスタイルです。彼は、サブクラスのクラスは決して無限に戻ることはないので、簡単にするためにチェックを外します。 –