一、为什么都俗称KVO技术为黑魔法
内部神秘、外观简洁。
二、阐述系统KVO的实现原理
当观察一个对象时,一个新的类(NSKVONotifying_A)
会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的setter
方法。重写的setter
方法会负责在调用原setter
方法之前和之后,通知所有观察对象值的更改。最后把这个对象的isa指针(isa指针告诉runtime系统这个对象的类是什么)指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。
简而言之,KVO是系统关于观察者模式的一种实现;KVO运用了isa混写技术的runtime来动态的为某一个类添加一个子类,重写setter
,同时将原有的isa指针重新指向新的类。
三、谈谈KVO的本质
当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过runtime
动态创建的子类,子类拥有自己的setter
方法实现,setter
方法实现内部会顺序调用如下方法实现:
1、willChangeValueForKey
方法、
2、原来的setter
方法实现、
3、didChangeValueForKey
方法,而didChangeValueForKey
方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:
监听方法。
四、关于手动触发KVO
被监听的属性的值被修改时,就会自动触发KVO。如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey
和didChangeValueForKey
方法即可在不改变属性值的情况下手动触发KVO,并且这两个方法缺一不可。
网友评论