🧰 记住 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对象会消失因为被释放了,这是修复成功的标志,说明内存泄露问题已经解决