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)

上一篇下一篇

猜你喜欢

热点阅读