当前位置: 首页 > news >正文

KVOController代码分析和踩坑

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。

相关文章:

  • Shell命令 中|| 使用
  • 针对ASP.NET Core Web API的先进架构
  • plsql 表中字段及注释时为乱码
  • BAT脚本编写教程入门提高篇
  • 时间序列异常检测算法S-H-ESD
  • docker实战
  • Hive 部署
  • Openstack 之 Prometheus 监控
  • python3 异步模块asyncio
  • 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
  • 大数据经典学习路线(及供参考)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MySQL数据库运维之数据恢复
  • 函数防抖和函数节流
  • 持续开放,腾讯TARS、TSeer助力Linux建设开源社区
  • 5、React组件事件详解
  • Apache Pulsar 2.1 重磅发布
  • DataBase in Android
  • ESLint简单操作
  • Flannel解读
  • gcc介绍及安装
  • Java超时控制的实现
  • js递归,无限分级树形折叠菜单
  • LeetCode18.四数之和 JavaScript
  • leetcode386. Lexicographical Numbers
  • MySQL-事务管理(基础)
  • react-native 安卓真机环境搭建
  • SOFAMosn配置模型
  • vue--为什么data属性必须是一个函数
  • WePY 在小程序性能调优上做出的探究
  • 初识 webpack
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 关于extract.autodesk.io的一些说明
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 使用 @font-face
  • 通过git安装npm私有模块
  • 学习Vue.js的五个小例子
  • 一道闭包题引发的思考
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • scrapy中间件源码分析及常用中间件大全
  • # Maven错误Error executing Maven
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (蓝桥杯每日一题)love
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)VC++中ondraw在什么时候调用的
  • (转)用.Net的File控件上传文件的解决方案
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版