- 先看如下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 赋值
小结:
- KVC会优先按照setKey,_setKey顺序访问器进行赋值
- 如果没找到访问器,则会在accessInstanceVariablesDirectly为YES下,按照顺序查找_key,_isKey,key,isKey的成员变量进行赋值 3.如果没有找到成员变量则会异常