1

在 iOS 文档中读取 KVC Compliant 时。我试图测试一个类。是否符合 KVC 类?

但我有一些问题:

  1. 属性“Name”、“Age”没有设置器,并且该类仍在使用 KVC 且没有错误并且不会触发任何异常

  2. 当没有为属性创建 setter 时,编译器会做什么?它是否创建了 setter 和 getter 对?

    人.h

    @interface Person : NSObject
    {
        NSString *name;
        NSInteger age;
    }
    

    人.m

    @implementation Person
    
    - (id)init
    {
        self = [super init];
        if (self) {
            name = @"Duc Nguyen";
            age = 10;
        }
        return self;
    }
    

    视图控制器.m

    - (IBAction)showKeyKVC:(id)sender {
        //--test kvc
        name1.text = [person valueForKey:@"name"];
        age1.text = [NSString stringWithFormat:@"%@", [person valueForKey:@"age"]];
    }
    

当我按下按钮时,结果是:年龄:10,姓名:Duc Nguyen。我不明白在这种情况下该类如何使用 KVC?

4

1 回答 1

4

答案在Accessor Search Patterns for Simple Attributes KVC 指南中。

setValue:forKey 的默认搜索模式:

setValue:forKey:当为属性调用默认实现时,将使用以下搜索模式:

  1. 在接收者的类中搜索名称与模式匹配的访问器方法set<Key>:
  2. 如果没有找到访问器,并且接收者的类方法accessInstanceVariablesDirectly返回YES,则在接收者中搜索名称与模式_<key>_is<Key><key>或相匹配的实例变量is<Key>

默认实现是对accessInstanceVariablesDirectly方法返回YES,所以KVC机制实际上是从nameage实例变量中获取值。

于 2013-07-06T06:33:05.140 回答