KVO本质
2021-05-10 本文已影响0人
凶猛老鹰
1.添加观察者的对象的isa指向的是NSKVONotifying_Person,未添加观察者的对象的isa指向的是Person(以Person类为例)
2.NSKVONotifying_Person是Runtime动态创建的一个Person的子类
3.KVO实现步骤:通过添加了观察者的对象的isa找到NSKVONotifying_Person, 再找到对应属性的set方法, 在set方法的内部调用Foundation中的_NSSetIntValueAndNotify(属性类型是int类型)C语音函数,_NSSetIntValueAndNotify函数内部实现了[self willChangeValueForKey], [super setAge: age], [self didChangeValueForKey].在didChangeValueForKey函数内部通知监听器,某某属性值发生了改变.
4.NSKVONotifying_Person重写了class方法(屏蔽内部实现隐藏了NSKVONotifying_Person类的存在),dealloc方法, 还有一个_isKVOA方法.
5.直接修改成员变量是不会触发KVO的
6.通过KVC修改属性是会触发KVO的(①实例对象调用willChangeValueForKey,②修改成员变量的值,③实例对象调用didChangeValueForKey)