KVC 和KVO
1) KVC 底层实现原理
KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的.
一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。
当一个对象调用setValue:forKey: 方法时,方法内部会做以下操作:
1.判断有没有指定key的set方法,如果有set方法,就会调用set方法,给该属性赋值
2.如果没有set方法,判断有没有跟key值相同且带有下划线的成员属性(_key).如果有,直接给该成员属性进行赋值
3.如果没有成员属性_key,判断有没有跟key相同名称的属性.如果有,直接给该属性进行赋值
4.如果都没有,就会调用 valueforUndefinedKey 和setValue:forUndefinedKey:方法、
2)KVC 常用的方法
![](https://img.haomeiwen.com/i14844115/72a493b6942222b7.png)
KVC 的使用场景
1) KVC 简单属性赋值
![](https://img.haomeiwen.com/i14844115/73eb792f944cae60.png)
使用setValue: forKey:方法能够给属性赋值,等价于直接给属性赋值
2) KVC复杂属性赋值
给person添加dog属性,并添加一个私有成员变量name2
![](https://img.haomeiwen.com/i14844115/830a170e163b115d.png)
![](https://img.haomeiwen.com/i14844115/5caab9c487c6cd7a.png)
修改dog中的name属性
![](https://img.haomeiwen.com/i14844115/a05170dd793219c5.png)
修改p中的成员变量
![](https://img.haomeiwen.com/i14844115/e9b7412a18ca86b3.png)
kvo 原理
KVO是通过isa-swizzling技术实现的(这句话是整个KVO实现的重点)。在运行时根据原类创建一个中间类,这个中间类是原类的子类,并动态修改当前对象的isa指向中间类。并且将class方法重写,返回原类的Class。所以苹果建议在开发中不应该依赖isa指针,而是通过class实例方法来获取对象类型。
手动调用KVO
![](https://img.haomeiwen.com/i14844115/d53bbb33d79f554b.png)
可以看到调用KVO主要依靠两个方法,在属性发生改变之前调用willChangeValueForKey:方法,在发生改变之后调用didChangeValueForKey:方法
注意点:
1、kvo的添加和移除要匹配出现,建议init中添加,dealloc中移除
2、在调用KVO时需要传入一个keyPath,由于keyPath是字符串的形式,所以其对应的属性发生改变后,字符串没有改变容易导致Crash