KVOController是FaceBook的一个开源库,提供了方便的姿势让你去使用KVO。 github.com/facebook/KV…

大概的用法如下:

 [self.KVOController observe:target keyPath:keyPath options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) {id newValue = change[NSKeyValueChangeNewKey];}];
复制代码

observe操作完成后,observer会在delloc时移除观察,非常方便。

我们来看看KVOController的实现流程:

1.Observer会创建一个FBKVOController的属性;

2.FBKVOController中包含一个NSMapTable的成员属性,用来存储observer的KVO信息;

3.FBKVOController创建一个_FBKVOInfo类型的实例,实例中存储了和KVO操作相关的信息(keypath等),然后将需要观察的对象Target作为Key,_FBKVOInfo的实例加入数组(对同一个Target的不同keypath的多次KVO操作)并把数组作为Value,存入步骤2中的mapTable中;

4.FBKVOController会调用_FBKVOSharedController的单例中的方法,同时将步骤3创建的info和观察的target传入给这个方法,这个单例进行了最终的KVO操作;

5._FBKVOSharedController的单例调用系统KVO方法,将自己作为观察者来观察Target对象。

在Observer内存被释放,执行dealloc时,其创建的FBKVOController属性的dealloc会通过KVOInfoMap找到所有KVO的对象,并执行移除观察的操作,十分巧妙的设计!

但是在使用的过程中还是有一些注意事项的: 首先,FBKVOController使用block来传递系统KVO的回调,因此要注意retain cycle。 其次,在使用的过程中,target不能强引用observer,否则也会形成retain cycle。我在上面的实现流程图中增加了一些标注来说明这个retain cycle是如何形成的:

红色的箭头代表了内存持有的方向,可以很清楚的看到形成了cycle。

转载于:https://juejin.im/post/5b28c5776fb9a00e52397f8c

KVOController代码分析和踩坑相关推荐

  1. 【软件分析】Tai-e实验代码理解与踩坑记录

    软件分析实验Tai-e代码理解与踩坑记录 A1 A2 A3 A4 实现类层次结构分析(CHA) 实现过程间常量传播 实现过程间 Worklist 求解器 A5 A6 A7 实例字段 load stor ...

  2. Spring5.x源码分析 | 从踩坑到放弃之环境搭建

    Spring5.x源码分析--从踩坑到放弃之环境搭建 前言 自从Spring发行4.x后,很久没去好好看过Spring源码了,加上最近半年工作都是偏管理和参与设计为主,在技术细节上或多或少有点疏忽,最 ...

  3. DroidPlugin代码分析(三) 占坑、动态注册

    接上篇,这一篇分析一下"占坑"部分.既然是占坑,先看一下DroidPlugin都占了哪些坑? 扫一眼AndroidManifest.xml可以发现,除了主进程意外,还注册了&quo ...

  4. seg代码配置的踩坑记录

    01. SEGMENTATION FAULT 正在配置OCNET的代码,在自己的本地运行没有任何问题,但是在服务器上一直报错:SEGMENTATION FAULT 这属于很概括的报错,无法直接看明白到 ...

  5. python MTCNN 人脸识别教程 配置+代码实例 远离踩坑

    1. github地址 https://github.com/ipazc/mtcnn 2. 安装 Currently it is only supported Python3.4 onwards. I ...

  6. Flutter中网络图片加载和缓存源码分析,踩坑了

    关于Android的近况 大家都知道,今年移动开发不那么火热了,完全没有了前两年Android开发那种火热的势头,如此同时,AI热火朝天,很多言论都说Android不行了.其实不光是Android,i ...

  7. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  8. java properties读取 封装_java properties 文件读取踩坑记

    当然,读取不到配置文件,是线上和开发环境结果不同这种情况.开发线下环境,明明读取正常,一放到线上,杯具了,没读取到. 然后呢?当然是看看线上这个目录下有没有这个文件,ftp上去一看,文件有啊,目录也对 ...

  9. OC 血压计 蓝牙BLE4.0 链接踩坑开发

    # 前言 公司项目要连接第三方公司的血压计,由于从来没有做过和蓝牙有关的项目,好奇的心驱使下下也想顺便了解一下这方面的知识,于是主动向领导请求开发这个功能,经过4天的折腾,终于弄好了,(为什么要4天呢 ...

最新文章

  1. Google Maps API 初级1
  2. delphi self 的使用
  3. STL源代码分析(ch2 内存分配)jjalloc.h
  4. 判断目录是否存在,若不存在即创建-Python
  5. Redis 购物车 - 删除商品与更新购买数量
  6. mysql 修改编码不成功解决办法
  7. -个很个性的二本人计时
  8. 微型计算机原理第三版期末试题,《微机原理A (闭卷)》期末试题含答案.doc
  9. netty权威指南-第三章——netty入门应用
  10. 手心输入法皮肤制作技巧
  11. 响应式网站建设的优缺点
  12. 中国34个省未来发展趋势深度分析
  13. 条件计数:COUNTIF、COUNTIFS函数
  14. 基于DS18B20数字温度传感器的温度计设计
  15. 正面管教之PHP_“PHP父母帮助父母解决问题”活动
  16. 软件测试工程师求职踩过的坑——实战经验的分享啊
  17. datax的启动文体datax.py解析
  18. NSI8121N0应用的一些心得
  19. 《我的成长》6月上 2009年第6期(总第6期)
  20. Spark2.4.8 求员工工资总额

热门文章

  1. 计算机osta试题,OSTA试题库.doc
  2. jqgrid编辑php,php – 实现jqgrid单元格编辑datepicker
  3. java多线程必须掌握吗_多线程模式有什么作用(java多线程必须掌握的知识)
  4. ubuntu18 安装redis-manager
  5. tcp 接收端优雅的写法_如何更优雅地接收设计反馈
  6. 面试官问:跨域请求如何携带cookie?
  7. mongo ttl索引
  8. python 中 __name__ 的使用
  9. 只让输入数字、字母、中文的输入框
  10. HBase键值分片的简单运用