Debug Memory Graph检查内存泄漏
2019-01-08 本文已影响0人
这个汤圆没有馅
讲到检查内存泄漏,很多人的第一反应就是 Instruments
里的 Leaks
。今天来讲一下Xcode 8
推出的 Debug Memory Graph
。
为了能看到内存详细信息,先打开 Edit Scheme-->Diagnostics
, 勾选 Malloc Scribble
和 Malloc Stack
。为了避免过多的性能消耗,在 Malloc Stack
中直接选择 Live Allocations Only
即可。

那怎么使用呢?
-
找到查看视图层级的
Debug View Hierarchy
边上的三个小圈圈的按钮,点击后如下图。 -
选择
Show the Debug navigator
, 如果有内存泄露的地方,边上会有一个紫色的感叹号出现。可以通过下方show only leaked blocks
过滤文件。 -
点击后会有该行的内存详细信息及对象之间的关联关系。其中黑线表示强引用,而灰色的线不代表弱引用,只是一些系统级别的引用或者苹果为了优化显示效果而添加的,可直接忽略。
-
点击右上角的
Show the Memory Inspector
,会有堆栈信息,并且能直接定位到内存泄漏的代码块。

其实上述的功能,在Runtime Issue navigator
中是类似的。

Debug Memory Graph
有好处也有坏处。
-
好处:它能很方便的定位到内存泄漏的地方。
-
坏处:有时它会误报。例如 - 当创建
UIButton
对象并将其添加到UIToolBars
项目数组时,我们已经看到它被识别为内存泄漏,但我们不明白为什么。
Debug Memory Graph
有时也会捕捉一下系统的内存泄漏,如下图,内存泄漏定位到了一个叫UIKeyboardPredictionView
的地方。原因是调起系统键盘后,系统并没有真正的将键盘回收,下次唤起时还会再次使用,而这个时候它就会将这个识别为内存泄漏。不过这个我们可以不用管。
