iOS 使用Instruments工具检查内存泄漏问题

  内存泄漏,通俗来说就是有一块内存区域被你占用了,但你又不使用这块区域也不让别人用,造成内存浪费,这就是内存泄漏,泄漏严重会造成内存吃紧,严重的会使程序崩溃。
在ARC内存管理模式下,产生内存泄露的的情况如下:

  • retain cycle,block强引用
  • delegate循环引用问题
  • 定时器NSTimer释放不当
  • 第三方提供方法造成的内存泄漏
  • CoreFoundation方式申请的内存,忘记释放

一、使用Instruments的Leaks工具进行内存泄露的检测

demo在最下面给出
打开Xcode自带的Instruments
方法一:

1981114-95b546ed889b83b3.png
打开Instruments

方法二:
或者:下图 build成功后自动跳出 Instruments工具,选择 Leaks选项即可
1981114-3adee210693354f2.png
打开Instruments

方法三:
或者:长按运行按钮,然后出现如图所示列表,点击 Profile
1981114-218ecc355423b48a.png
打开Instruments

在下面的 Instruments列表中选择 Leaks
1981114-660af19cfd4099da.png
Instruments

以上算是打开Instruments的基本方法,下面开始进行使用Instruments进行内存泄漏检测

  1. 首先编译代码,上面的方法二,快捷键(command+i),编译完成弹出Instruments选择Leaks

    1981114-964f01e8fe08e179.png
    Leaks

  2. 点击上面开始运行项目,这时候会启动app


    1981114-9a69aec9241e0b93.png
    启动app
  3. 对于启动的项目,点击按钮push到第二个界面,再次pop回来,反复几次,为了内存泄漏更明显一点


    1981114-f3faa01b7f0d9666.png
    app界面1

    1981114-d98d19f6b14cae03.png
    app界面2
  4. 接下来会发现出现红色的x,这个就表示出现了内存泄漏


    1981114-30c293bec2078e3d.png
    Leaks
  5. 在下面的模式中切换到Call Tree模式下,可以看到列表里列出了内存泄露的调用逻辑:

    1981114-202d911472506ec3.png
    Call Tree

  6. 下面就是最关键的一步,在这个界面的下面有若干选框,在Call Tree选项中选中Separate by ThreadHide system Libraries

    1981114-edb42908dccf301d.png
    Leaks选项

  • Separate By Thread:线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程。每个线程应该分开考虑。只有这样你才能揪出那些大量占用CPU的"重"线程,按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。

  • Invert Call Tree:从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时(这意味着你看到的表中的方法,将已从第0帧开始取样,这通常你是想要的,只有这样你才能看到CPU中话费时间最深的方法),比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。

  • Hide System Libraries:表示隐藏系统的函数,调用这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的。基本是必选项。注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.因为通常你只关心cpu花在自己代码上的时间不是系统上的,隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。隐藏缺失符号。如果 dSYM 文件或其他系统架构缺失,列表中会出现很多奇怪的十六进制的数值,用此选项把这些干扰元素屏蔽掉,让列表回归清爽。

  • Flatten Recursion:递归函数, 每个堆栈跟踪一个条目,拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。

  1. 选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处,如图所示:


    1981114-18ceff7bb68610ef.png
    泄漏提示

    双击后显示如下:


    1981114-6c9548e25c5d5ffc.png
    问题代码
  2. 接下来就可以修改问题代码来解决内存泄漏问题

注意

在选择Call Tree后,可能你会发现查看不到源码从而无法定位内存泄漏的位置,只是显示16进制的数据。此时需要你在Xcode中检查是否有dSYM File生成,如下图所示选择第二项DWARF with dSYM File。

1981114-90df8c52fdb5f935.png
注意点

Demo下载

猜你喜欢

转载自blog.csdn.net/weixin_34235135/article/details/87554964