Xcode 8 引入了一个新的特性 Debug Memory Graph, 终于结束了内存无限增长却只能摸瞎找问题的时代。
内存泄露的原因
- block 循环引用
- NSTimer 未释放
- 通知未能正确的移除
我们大部分的内存泄露都是由于 block 的循环引用,使用 ReactiveCocoa
之后这个问题更甚,所以能准确定位到出现问题的位置非常重要。
使用 Debug Memory Graph
配置
如果没有勾选 Malloc Stack
在调试的时候,在右侧是看不到调用的堆栈信息。
ps: 1. 勾选 Malloc Stack
之后内存会相应的增高,如果不调试可以关闭该选项
2. 建议选择 Live Allocations Only
如果选择 All Allocations and Free History
会出现一些额外的影响因素
打开方式
or
Debugger Navigator
-> View Memory Graph Hierarchy
分析内存泄露
如上图示,括号中的数字代表该类在内存中实例的数量。点击箭头所指的感叹好小图标,会显示出内存泄露的类。如果没有也不要高兴的太早,括号中数字比较大类,可能是本该释放却没有释放的类。如 A 类页面进入到B 类页面,返回之后查看内存图谱, 如果 B 类依旧在列表中,就需要具体分析是否 B 类中内存泄露无法释放,下图为点击该类的堆栈信息。
参考链接:
iOS — Identifying Memory Leaks using the Xcode Memory Graph Debugger