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:方法