KVC(key-value coding):键值编码,利用字符串类型的key值去访问/修改对象的属性值。可以访问/修改的属性值可以是私有的,也可以修改系统的readonly属性。
KVC是基于runtime的机制来实现,它会先检查属性所对应的setter方法,如果有,就调用setter方法,如果不存在,就会去查找与key相同名称的成员变量。
实际应用:
1.字典转模型
2.为只读控件赋值,比如说给TabBarController设置自定义TabBar.
[self setValue:myTabBar forKey:@"tabBar"];
KVO(key-value observe):键值观察,动态的监听对象属性值的变化,可以获取新值和旧值。
KVO也是基于runtime机制,当观察对象A时,KVO用动态机制创建一个名为NSKVONotifying_A的新类,该类继承自A的本类,且NSKVONotifying_A重写了观察属性的setter方法。setter方法会负责在调用原setter方法前后,通知所有观察对象属性值的变化情况。其中isa指针在对象注册为观察者时,会指向新子类,这个被观察的对象就变成新子类的对象,从而调用重写的setter方法,启动键值通知机制。
可以自己创建一个类来验证其系统内部是否自己创建了一个新类。

打印信息如下,“KVO未能为名称NSKVONotifying_Person分配类对,自动键值观察对此类不起作用”

观察机制相当于
- (void)setName:(NSString *)name{
//访问之前调用
[self willChangeValueForKey:@"name"];
[super setName:name];
//访问之后调用
[self didChangeValueForKey:@"name"];
}
注意:如果直接通过成员变量去修改属性值的而不通过setter或者KVC,比如_name = @"haha",是不会激发KVO机制的。所以前提是要遵循KVO的属性设置方法来变更属性值。
网友评论