手动实现KVO解析
PS:原链接没找到,侵立删~
实现原理:
假设被观察者为A类的实例L,实现流程如下:
1.在运行时,为A类创建一个子类B。
2.强行将实例L的类型改为B。
3.为B类添加新的setter方法。
4.为B类添加观察者列表属性M。
5.将观察者的信息封装为类放入B类的M。
重点在第三项——kvo的setter方法如何写:
因为是将实例L的类更改为了原类A的子类B,需要调用父类的对应的setter方法。
由于在整个KVO过程中,观察的属性不一致则setter方法的名字也不一致。无法直接运用super调用,最简单的方法就是通过runtime来实现。
1. 获得setter方法名
2. 根据setter方法名获得对应的setter消息
3. 根据setter方法名获得getter方法名
4. 根据getter方法名获得被观察属性当前值
5. 创建消息传递结构体(为了把setter消息转发给父类)
6. 把setter消息转发给父类
7. 遍历观察者列表,得到观察者信息,执行操作
网友评论