KVO的本质是什么?
1.利用runtime API动态生成一个子类,并且让实例对象的isa指向这个全新的子类;(例如当前类是MJPerson,那么runtime生成的子类就是NSKVONotifing_MJPerson,而该子类又是MJPerson的子类.并且在MJPerson类基础上额外还会生成class方法,dealloc方法,_isKVOA方法)
2.当修改实例对象的属性时会调用Foundation的_NSSetxxxValueAndNotify函数,改函数实现的原理是:
2.1.先实现willChangeValueForKey:
2.2.再实现父类原来的setter方法;
2.3.最后实现didChangeValueForKey;
2.4.最后内部会触发监听器(Obserser)监听方法(observerValueforKeyPath:options:context:);
总结: 使用runtime改变set方法.
如何手动调用KVO的?
手动调用 willChangeValueForKey:和didChangeValueForKey;方法.