使用自定义getter,setter和ivar的键值编码

时间:2016-12-15 09:02:51

标签: objective-c kvc

我想知道,当此属性定义了自定义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)检索使用键值编码设置的值。

有谁知道这是如何在内部工作的?是否期望这种行为,我错过了什么?

1 个答案:

答案 0 :(得分:0)

将以下方法添加到Class1

- (void) showVars
{
   NSLog(@"->prop %ld | ->customIVar %ld", prop1, customIvar);
}

在你改变你的财产后调用它,你会看到发生了什么。

阅读您链接的参考文献,它对搜索getter和setter有什么看法?

您已找到答案。

是否有详细记录?可能不是,Objective-C&amp; Cocoa没有正式的语义描述: - (

HTH