运用Memory Graph排查内存泄漏

🧰 记住 Memory Graph 的核心作用:

可视化 对象间的引用关系

快速发现 循环引用

无需停止应用 实时查看

🧰 总结:如何“看懂”Memory Graph 找泄漏?

步骤 1:看对象数量

每个类的数量(如LeakingViewController (6)、LeakyClass (12)):若数量远大于预期(比如视图控制器只应 1 个,类实例只应 1 个),则高度可疑。

实战:定时器泄漏比较隐蔽,进入退出查看控制器数量是否增长;再进而使用Leaks工具排查

 步骤 2:看引用链

从可疑对象出发(如LeakingViewController、LeakyClass),顺着箭头看谁在引用它,谁被它引用。

重点关注强引用循环(A→B→C→A)。实战:闭包强引用和对象相互引用最好排查

 步骤 3:结合代码逻辑

回忆代码中该对象的创建、赋值、引用方式:

定时器是否用了 block 且捕获self?

自定义类是否有双向引用(如sibling、delegate未弱引用)?

闭包是否强引用了外部对象?

 步骤 4:验证释放时机

在代码中手动触发释放(如 pop 视图控制器、销毁单例),然后在 Memory Graph 中查看该对象是否消失。若仍存在,说明泄漏。

🧰 实战:

引用箭头:表示对象间的强引用关系(箭头方向 = 引用方向,如 A→B 表示 A 强引用 B)。

闭包强引用:这是典型的“闭包捕获 self 导致内存泄漏”模式

✅ 快速检查步骤

进入退出目标页面,点击 Memory Graph 图标

1.检查左侧对象列表

是否有本应释放的对象数量不为0 (控制器数量增长)

是否有黄色警告三角

2.检查右侧引用图

是否存在强引用循环

是否存在意外的强引用链

Memory Graph图标
两个User对象互相引用,导致内存泄露,实线代表强引用
使用weak打破循环后,weak或无引用通常是虚线
Task包含manager,而manager则包括Task,导致循环引用;若不存在循环引用,左侧Task与TaskManger对象会消失因为被释放了,这是修复成功的标志,说明内存泄露问题已经解决
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容