1.KVC实现原理
- KVC,键值编码,使用字符串直接访问对象的属性;
- 底层实现,当一 个对象调用setValue方法时,方法内部会做一下操作:
(1)检查是否存在相应key的set方法,如果存在,就调用set方法;
(2)如果set方法不存在,就会查找与key相同名称且带下划线的成员属性,如果有,则直接给成员属性赋值;
(3)如果没有找到_key,就会查找相同名称的属性key。如果有,就直接赋值;
(4)如果还没有找到,则会调用valueForUndefinedKey:和setValue:forUndefinedKey:方法
2.KVO的实现原理
KVO-键值观察机制,原理如下:
1、当给A类添加KVO的时候,runtime动态的生成了一个子类NSKVONotifying_A,让A类的isa指针指向NSKVONotifying_A类,重写 class方法,隐藏对象的真实类信息;
2、重写坚听属性的setter方法,在setter方法内部调用了Foundation的_NSSetObjectValueAndNotiify函数;
3、_NSSetObectValueAndNotify函数内部过程:
(a)首先会调用willChangeValueForKey;
(b)给属性赋值;
(c)调用diddChangeValueForKey;
(d)调用observer的observerValueForKeyPath去通知监听属性值发生了变化
4、重写dealloc,释放KVO 的内存
3.如何手动触发KVO方法
手动调用willChangeValueForKey 和didChangeValueForKey.
键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey: 和 didChangeValueForKey。在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后, didChangeValueForKey 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。如果可以手动实现这些调用,就可以实现“手动触发”了 有人可能会问只调用didChangeValueForKey方法可以触发KVO方法,其实是不能的,因为willChangeValueForKey: 记录旧的值,如果不记录旧的值,那就没有改变一说了