KVC

101 阅读1分钟
  • 先看如下Person类
@interface Person : NSObject
{
    @public
    NSString *name;
}
@end

@implementation Person

-(void)setName:(NSString *)name {
    NSLog(@"%s",__func__);
}

@end
  • controller
NSLog(@"----开始----");
Person *p = [[Person alloc] init];
[p setValue:@"lily" forKey:@"name"];
NSLog(@"person.name : %@",[p valueForKey:@"name"]);
NSLog(@"person->name : %@",p->name);
  • 打印
----开始----
 -[Person setName:]
 person.name : (null)
 person->name : (null)

由于 setName 没有赋值因此打印 null

  • 修改Person类
@interface Person : NSObject
{
    @public
    NSString *name;
    NSString *_name;
    NSString *isName;
    NSString *_isName;
}
@end

@implementation Person

@end
NSLog(@"----开始----");
Person *p = [[Person alloc] init];
[p setValue:@"lily" forKey:@"name"];
NSLog(@"person.name : %@",[p valueForKey:@"name"]);
NSLog(@"person->name : %@",p->name);
NSLog(@"person->_name : %@",p->_name);
NSLog(@"person->isName : %@",p->isName);
NSLog(@"person->_isName : %@",p->_isName);
  • 打印
----开始----
person.name : lily
person->name : (null)
person->_name : lily
person->isName : (null)
person->_isName : (null)

根据上面打印, KVC会优先给_key 赋值

小结:

  1. KVC会优先按照setKey,_setKey顺序访问器进行赋值
  2. 如果没找到访问器,则会在accessInstanceVariablesDirectly为YES下,按照顺序查找_key,_isKey,key,isKey的成员变量进行赋值 3.如果没有找到成员变量则会异常