Xcode Instruments提供了各种各样的工具用来定位APP的各种稳定性问题。这里简单总结几个问题:
1. 内存泄漏
Xcode->Open Developer Tools->Instruments->Leak,打开后点击运行。执行测试流程后,如果没有内存泄漏,则Leak工具显示的是√,如果有泄漏,则显示×。
这时候选中×的区域,则Leaks栏选择Call Tree,选中"Invert Call Tree", "Hide System Libraries",即可显示泄漏的堆栈。如果没有显示符号堆栈,则检查Product->Scheme->Edit Scheme,看目前是否是Debug状态,同时查看项目的Build Settings->Debug Information Format,看是否是DWARF with dSYM File,该文件主要是一些符号信息。如果还是不显示堆栈,可以点击File->Symbols手动选择Symbol的路径。
定位内存泄漏是一回事,还要分析为什么会出现内存泄漏,是调用者调用的问题,还是类设计者设计存在问题,比如没有遵循谁申请谁释放的原则。
2. 内存越界
3. 高CPU占用
有时候APP很卡,原因是CPU过载,有些线程过度使用了CPU。高CPU占用有两个危害,一个是坏的用户体验,另外一个是ios系统会将连续一段时间高频使用CPU的APP直接杀死。使用Instruments中的time profile即可定位。Xcode->Open Developer Tools->Instruments->time profiler,打开后点击运行。执行测试流程后,CPU占用率显示曲线,横轴是时间,纵轴是CPU使用率。这时候鼠标选中使用率高的区域,界面就会显示使用率高的线程调用,及函数调用。
这个时候就要分析为什么这些函数耗费了过多的CPU,有些函数本身就耗费很多CPU,比如写磁盘,读网络数据等IO操作;有时候是一些程序写法存在问题。比如最近发现的主APP中两个高CPU占用的问题:
a, 音视频数据队列采用了vector实现,而且每来一个数据,执行的是push_front,而不是push_back,造成CPU利用率隔一段时间就出现一个尖峰,是vector在执行realloc和copy操作,改为std::list后不再出现。
b, 读取音视频队列的关键线程加进了一些无意义的查询数据语句,每读一个数据包查询一次,白白浪费了很多CPU。
还有一些APP卡顿是GPU过载,需要使用Core Animation定位。除了以上几个工具,Energy Log用来分析电量,Network用来进行流量分析。