Instruments检测解决内存泄露以及进行性能测试

时间:2021-10-28 11:06:49

1、启动Xcode自带的Instruments。这里有两种方法启动。

方法一:

Instruments检测解决内存泄露以及进行性能测试

方法二:

Instruments检测解决内存泄露以及进行性能测试

2、选择Leaks选项。(该选项用来进行内存泄漏检测)

说明:

  • Leaks:找到引发内存泄漏的起点。
  • Time Profiler:分析代码的执行时间,找出导致程序变慢的原因。
  • Allocations:监测内存使用/分配情况。迅速膨胀的内存可以很快让程序毙命,所以要多加防范。

Instruments检测解决内存泄露以及进行性能测试

3、然后这里选择要测试的app之后,先在Xcode上运行app,再在Instruments上点击左上角“红色圆点”开始运行测试:

Instruments检测解决内存泄露以及进行性能测试

正在测试:

Instruments检测解决内存泄露以及进行性能测试

4、下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree。

Instruments检测解决内存泄露以及进行性能测试

显示如下图界面:

Instruments检测解决内存泄露以及进行性能测试

5、下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:

Instruments检测解决内存泄露以及进行性能测试

6、最后选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处:

Instruments检测解决内存泄露以及进行性能测试

补充:

下面进行耗时检测:

1、选择Time Profiler选项

Instruments检测解决内存泄露以及进行性能测试

2、照前面的方法选择相应的app后,先在Xcode上运行app,再在Instruments上点击左上角“红色圆点”开始运行测试:

Instruments检测解决内存泄露以及进行性能测试

3、然后在右边的区域给这几项打钩:

Instruments检测解决内存泄露以及进行性能测试

这些选项默认是不选的,但把它们勾选上可以帮你更快定位到关键的代码上,往往这也是问题的源头。

  • Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
  • Invert Call Tree:反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
  • Hide System Libraries:隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
  • Flattern Recursion:拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
  • Top Functions:找到最耗时的函数或方法。

4、现在可以查看到代码里面的方法名了,最后双击方法名进行定位!:

Instruments检测解决内存泄露以及进行性能测试

5、这就是定位到相应的代码了:

Instruments检测解决内存泄露以及进行性能测试

首先从最底层上说,当两个对象相互建立了强引用(strong reference),当一个对象被释放,另一个对象由于是强引用的关系不允许被释放,此时 ARC 无法确定没被释放的对象到底还有没有用,于是就导致了内存泄漏。

要解决这个问题,可以将其中的一个对象中变量设为 weak,不让它出现在保留周期中。很多开发者在管理 view controller 时常会在内存泄漏上中招,以为换了新的controller,老的 controller 就被释放回收了,其实还没。这样代码一多,就会造成很多对象都没被释放。所以用这个工具把整个应用跑一遍,把那些断链的强引用清理干净,会大有裨益。

除了上述这三类工具,Instruments 还有很多实用的工具,推荐大家根据自己的关注点,花些时间去学学。比如:

  • Core Data:监测读取、缓存未命中、保存等操作,能直观显示是否保存次数远超实际需要。
  • Cocoa Layout:观察约束变化,找出布局代码的问题所在。
  • Network:跟踪 TCP / IP和 UDP / IP 连接。
  • Automations:创建和编辑测试脚本来自动化 iOS 应用的用户界面测试。

最后小总结下。我倒不想一味夸大 Instruments 的作用,如果应用跑得挺痛快,没出现啥调皮行为,大可把它忽略,等到问题来了再做优化。对于新手来说,花些时间了解 Instruments 的功能,多调试多积累经验,这样做出来的应用在用户体验上肯定错不了。