kvo底层
参考:https://www.jianshu.com/p/a0cf1b450371
利用了isa_swizzling技术,swizzling是一种OC级别的Hook技术,所以isa_swizzling就是一种isa Hook技术,在一个支持KVO的对象被添加了观察者,系统会为其生成一个子类,重写了set方法,并将该实例的Isa指针指向了新的这个子类(class),这样对被观察者进行属性赋值的时候调用的是重写后的set方法,而set方法内部添加了通知机制;
按理说你系统自动生成一个子类,子类重写父类的set方法,但是kvo在父类中,二者有吊毛联系啊,
所以这里才用到了runtime
当添加入一个观察者时,利用了runtime动态添加属性接口将该观察者加入该被观察实例对象上(实际上需要维护一个队列,用于记录所有观察该属性的观察者,这里为了简单),用于后续监听属性改变时给这个观察者发送消息;
然后,就是同样利用runtime改变该被观察者实例对象的isa指针(class),这样后续发送消息给被观察者均是往SUKVO_SubClass定义的方法里找(系统实现的子类为NSKVONotifying_原有类);
说白了就是runtime动态添加了属性并修改了父类的指针,所以系统才能实现子类的set
网友评论