一、底层实现步骤
需求:观察对象
Person,观察属性name
- 利用
runtime动态创建(objc_allocateClassPair)Person_A类,继承自Person类 - 设置
Person对象的指针指向Person_A - 检测
Person_A的方法列表methodList中是否有setName:方法,如果没有就动态添加(class_addMethod)重写的setter方法。 -
kvo_setter方法中利用setter方法取出getter方法,并获得旧值。 -
kvo_setter中通过objc_msgSendSuper发送新的value值 - 在给
Person_A添加观察者时候会动态创建(objc_setAssociatedObject)Observers对象的数组,每个数组的元素中包含观察对象、观察属性、新旧值等信息 - 在
Person_A的setter方法里会进行异步回调,通知观察者 - 在
Person某个属性移除观察时,则在Observers中移除该条记录。














网友评论