setValue:属性值 forKey:属性名: 为指定属性设置值
valueForKey:属性名: 获取指定属性的值
[p setValue:@"小麦" forKey:@"_name"];
NSLog(@"%@",p.name);
KVC setValue: forKey: 执行机制:
1.优先考虑调用“setName:属性值;” 代码通过setter 方法完成设置
2.如果没有setName KVC搜索该类名为_name的成员变量,无论该成员变量实在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际上就是对_name成员变量赋值
3.若1 2 皆无 搜索名为name,无论该成员变量实在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际上就是对name成员变量赋值
4.1 2 3 都没有找到 执行该对象的setValue:forUndefinedKey:,此方法的默认执行是为了引发一个称为 NSUnknownKeyException的异常
valueforKey@"name"底层执行机制:
1.优先getter方法
2.否则搜索类名为_name的成员变量,如set...般不考虑权限
3.否则搜索name
4.否则执行valueforUndefinedKey:方法
NSUnknownKeyException方法的重写,不需要声明。//设置部分
-(void) setValue:(id) value forUnderfinedKey: (id) Key{
//自定义语句
}
-(void)valueForUndefinedKey:(id)key{
//自定义语句
}
OC中并不存在绝对隐藏的方法,既是一个方法仅仅在类实现部分定义,类接口部分没有定义,也可通过NSObject提供的performSelector:或 performSelector:withObject:方法调用。
KVC处理nil值:
int 等类型无法接受nil 可以重写setNilValueForKey:方法
-(void) setNilValueForKey:(id)key
{
//自定义语句
[super setNulValueForKey: key];
}
Key路径:
除了操作对象的属性之外,还可操作对象的"符合属性" 所谓“复合属性“,KVC机制将其称为Key路径,比如
为实例提供直接操作类属性成员变量中的成员变量
setValue:forKeyPath: 根据Key路径设置属性名
valueForKeyPath: 根据Key路径获取属性值 设置复合属性时,需要用到ForKeyPath而不是ForKeyPath
[u setValue:[[FKPreson alloc] init] forKey:@"p"];//使用的时候要把类对象初始化
[u setValue:@"小麦" forKeyPath:@"p.name"];
NSLog(@"%@",[u valueForKeyPath:@"p.name"]);
性能比setter getter差,但是灵活性高。