objective-c KVC与KVO
概述
KVC和KVO都应算是动态特性。
- KVC(Key Value Coding)键值编码
- KVO(Key Value Observing)键值监测
KVC
KVC可以通过键的方式给一个变量赋值(获取值),并且无论这个变量是否为private均可访问。
这个索引用的键一般就是变量的字面名字,比如需要访问的变量为a,则键为@“a”。
通过KVC设置变量可以使用下面的方法:
| 1 | setValue:属性值 forKey:属性名 //用于简单路径 | 
通过KVC读取变量可以使用下面的方法:
| 1 | valueForKey:属性名 //用于简单路径 | 
例如:
| 1 | [person setValue:@28 forKey:@"age"]; | 
age为person类中的一个私有变量,account是person类中的一个属性变量,account类中还有一个变量balance。
Tips
1.即便是类中的私有变量,通过KVC也能进行访问;
2.如果是访问类中变量中的变量,需要使用复合路径;
3.如果要赋值的变量不是字符串类型,也要在第一个参数中调用@符号,@+具体值,但如果值是一个对象,那就直接写对象名就好了。
KVC进行变量查找的规则(以查找变量a为例):
- 如果是变量赋值操作 - 优先调用类中属性变量a的setter方法;
- 如果没有a的setter方法,则试图访问_a变量;
- 如果没有_a变量,则试图访问a变量;
- 如果没有a变量,则会调用这个类的setValue: forUndefinedKey:方法
 
- 如果是变量取值操作 - 优先调用类中属性变量a的getter方法;
- 如果没有a的getter方法,则试图访问_a变量;
- 如果没有_a变量,则试图访问a变量;
- 如果没有a变量,则会调用这个类的valueforUndefinedKey: 方法
 
使用KVC方式进行值访问的目的:简化代码。
例如,变量a=@”name”,此时如果想获取类中name变量的值就可以直接通过KVC获取
| 1 | value = [person valueForKey:a]; | 
不用KVC的代码如下:
| 1 | if([a isEqualToString:@"name"]) | 
KVO
Key Value Observing(简称KVO),键值监听,简单来说,就是当某个被监听的值发生变化时,会通知相应的监听函数,监听者可以重写这个监听函数,从而得到变动通知。
KVO使用方法:
- 注册监听值 - 1 - addObserver: forKeyPath: options: context: 
 
- 删除监听值 - 1 - removeObserver: forKeyPath 
- 1 - removeObserver: forKeyPath: context: 
 
- 回调监听 - 1 - observeValueForKeyPath: ofObject: change: context: 
 
KVO使用步骤:
1.通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器;
2.重写监听器的observeValueForKeyPath: ofObject: change: context:方法