如何优雅地检测内存泄漏 一文介绍了如何在 iOS 中快速高效地检测并修复内存泄漏,要点如下:
- 使用 MLeaksFinder 等工具找到内存泄漏对象
- 使用 FBRetainCycleDetector 获取循环引用链
- (对于被全局对象引用的场景)获取全局对象引用链
JCLeaksFinder
为了方便使用,我把上述功能进行了统一封装,开源了 JCLeaksFinder 项目。JCLeaksFinder
基于 MLeaksFinder 和 FBRetainCycleDetector。
- MLeaksFinder 负责找到内存泄漏对象。
- FBRetainCycleDetector 负责输出循环引用链。
JCGlobalRetainDetector
负责输出全局对象引用链。
特性
作为一款 iOS 内存泄漏检测工具,JCLeaksFinder
主要有以下特性:
- 支持检测ViewController/View内存泄漏
- 支持添加自定义白名单
- 支持自动输出循环引用链
- 支持自动输出全局对象引用链(自研)
- 优化接口,使用更方便
检测流程
- 在页面退出时触发 MLeaksFinder 检测内存泄漏对象。如果有内存泄漏对象,继续下一步,否则直接跳转到第 5 步。
- 使用 FBRetainCycleDetector 检测泄漏对象是否存在循环引用链。如果不存在,继续下一步,否则跳转到第 4 步。
- 使用 JCGlobalRetainDetector 检测泄漏对象是否被全局对象引用。如果是,继续下一步,否则跳转到第 5 步。
- 将引用信息回传给业务层,业务层可自定义提示形式。
- 结束检测。
在上述的检测流程中,如果检测到了内存泄漏对象,可能会遇到以下问题:
- 该对象是允许不被释放的。此时可添加检测白名单,避免继续检测出该对象。
- 该对象并没有输出任何循环引用链或者全局对象引用链信息。此时可使用 Xcode Memeory Graph 继续定位具体原因。
更多信息请前往 Github查看项目源码。