题外话:
我相信90%以上的iOS开发者不经常使用xcode提供的instrument调试工具,毕竟用户的实际体验才是第一感觉。既然xcode有这个工具,还是要研究下的:
遇到第一个问题:
instrument无法选择真机,无法进行下一步操作了,这个重启下xcode和iPhone就ok了
几个工具:
Instruments 提供了很多功能,我会重点介绍一下我最常用的三大类:
Time Profiler:分析代码的执行时间,找出导致程序变慢的原因。
Allocations:监测内存使用/分配情况
迅速膨胀的内存可以很快让程序毙命,所以要多加防范。
Leaks:找到引发内存泄漏的起点
即使有 ARC(自动引用计数)内存管理机制,但在现实中对象之间引用复杂,循环引用导致的内存泄漏仍然难以避免,所以关键时刻还要自力更生。
一、Time Profiler(函数调用时间)
几个概念:
Separate By Thread:线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.
Invert Call Tree:从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
Hide Missing Symbols:如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据.
Hide System Libraries:这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的.基本是必选项.注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.
系统和应用本身一些调用路径完全揉捏在一起.完全看不到我们关心的应用程序中实际代码执行耗时和代码路径实际所在位置.简单的方式可以快速勾选右边Call Tree中Separate Thread和Hide System Libraries两个选项[后面会解释选项作用]:
基本操作:点击右边设置选项,线程分离、过滤掉系统性能分析。查看列表耗时线程堆栈信息,点击可在右侧看到具体函数。可跳入xcode查看函数。这里需要注意的是,工具把延时动画时间也计入到函数执行时间,所以不能仅仅依靠数据时间大小来单纯判定函数是否耗时。
二、Allocations(内存分配)
这里只是摘抄作者的部分文章,作者写的真的很全很全……
我们可以惊讶的看到All Heap Allocations(真实内存)只有5.47,而All Anonymous VM(虚拟内存:为程序分配的虚拟内存,当程序有需要的时候,能够及时为程序提供足够的内存空间,而不会现用现创建)高达17.2,所以手机分配给我们的内存是22.68;我们现在不检测内存泄漏(是另外一个工具),所以我们尽量优化VM(因为不是app真实占用的内存,只是系统分配的),而VM主要由以下三部分组成:
1.VM:ImageIO_PNG_Data
这里原作者用的自动释放池。
2.VM:CG raster data
这里原作者用的sd框架的方法,在delegate实现,确实减少了内存占用。我这里暂时没有去实践。
3.VM:CoreAnimation
暂未解决
另外:Allocations工具右侧mark generation标记功能,可对比前后操作内存增加量
参考文章写得很清楚,本文下面有传送门。
这个主要是参照其他人的文章啦
Time Profiler:(传送门)
Allocations: (传送门)