一、底层实现步骤
需求:观察对象
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
中移除该条记录。
网友评论