应用控制器.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 遵循启发式方法来设置或获取值。对 first 的调用-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