我想知道,当此属性定义了自定义getter,setter和ivar时,Key-Value Coding如何访问属性值,在Objective-C中工作。根据{{3}},运行时将首先搜索getter方法,然后回退到使用反射字符串查找ivar。
根据搜索模式,当找不到吸气剂和静脉注射器时,应该抛出异常。
但是,当我运行以下代码时:
#import <Foundation/Foundation.h>
@interface Class1 : NSObject {
NSInteger prop;
}
@property (getter=customGetter,setter=customSetter:) NSInteger prop;
@end
@implementation Class1
@synthesize prop = customIvar;
@end
int main() {
Class1 *class1;
// Create and give the properties some values with KVC...
class1 = [[Class1 alloc] init];
class1.prop = 9;
NSLog(@"Set value to 9 with direct access");
// Directly access value, should return 9.
NSLog(@"Direct access: %ld", class1.prop);
// Set with setValue:forKey: to 20.
NSLog(@"Set value to 20 with KVC");
[class1 setValue:[NSNumber numberWithInt:20] forKey:@"prop"];
// Directly access value.
NSLog(@"Direct access: %ld", class1.prop);
// Access value using KVC
NSNumber *propVal = [class1 valueForKey:@"prop"];
NSLog(@"ValueForKey access: %d", [propVal intValue]);
}
我得到了这个输出:
Set value to 9 with direct access
Direct access: 9
Set value to 20 with KVC
Direct access: 9
ValueForKey access: 20
似乎我得到两个不同的值:直接从属性(9
)读取时,将检索通过直接访问属性设置的值。使用键值编码(20
)检索使用键值编码设置的值。
有谁知道这是如何在内部工作的?是否期望这种行为,我错过了什么?
答案 0 :(得分:0)
将以下方法添加到Class1
:
- (void) showVars
{
NSLog(@"->prop %ld | ->customIVar %ld", prop1, customIvar);
}
在你改变你的财产后调用它,你会看到发生了什么。
阅读您链接的参考文献,它对搜索getter和setter有什么看法?
您已找到答案。
是否有详细记录?可能不是,Objective-C&amp; Cocoa没有正式的语义描述: - (
HTH