手动实现KVO解析

手动实现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. 遍历观察者列表,得到观察者信息,执行操作

带注释的Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,099评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,633评论 4 61
  • 我给那个卖国求荣马里兰的什么鬼算了一卦,"鼠伏穴,本自宁,一露首,猫即跟,伸威扬爪,鼠丧残生。"很危险啊!她...
    皇兄H阅读 4,404评论 2 1
  • 1 注册GitHub账号 1.1 登录gitHub官网 https://github.com 通过点击sign u...
    乐乐的熊阅读 5,415评论 0 2
  • 有时在想,明天要去做什么 有时又在想明天有很多事 你不能用你的价值观去要求别人去遵守,你也不能去要求别人去为你付出...
    一僧旅人阅读 2,394评论 0 0

友情链接更多精彩内容