关于Instruments有网友如是说的:“一句话: 内存开销、运行速度、内存泄露 and so on”。
如此简单的回答肯定打发不了咱们各位看官和面试官,当然上述表达和下边的网友总结的意思是一样的:
问:您一般是怎么使用Instruments的?
这个问题也就是考察下你经验如何了, Instruments里面工具很多,也没必要逐一说明,挑几个常用的说下就好:
>Time Profiler:分析代码的执行时间,找出导致程序变慢的原因。
>Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
>Allocations:用来检查内存分配,写算法的那批人也用这个来检查
>Leaks:检查内存,看是否有内存泄露
还有对Instruments这么理解的,说的也不错:Instruments的价值在于,它使我们深刻理解我们代码的内部运作。
好了,那么就开始我们自己的Instruments之旅吧,揭开神秘面纱。
注:本文大部分篇幅将讲述Allocations、Leaks、Time Profiler、Zombies这四项,因为是经常用到的,其他的可能简单介绍或者一带而过。
关于Instruments的概述请参考Instruments概述,可以整体的理解一下Instruments。
首先我们要知道怎么打开这个Instruments:在xcode中有好几种打开的方式,具体如下:
1、
2/
3.长按启动键,旋转Profile
Instruments页面如下,里面全是英文,笔者为大家用有道翻译了一下,哪里不对,希望大家告知,我进行修改。
其实我们可以看到xcode开发人员的用心,一些图片上边的标志我们一看就能明白是什么意思,例如能量诊断,其实就是手机上边的电池嘛?,还有泄漏,就是一个管子,有水滴?滴下来了,就是泄漏的意思。还有网络,就是一个信号塔发射信号的意思。有的看不懂没关系,我这不是给大家翻译了嘛。
另外有的时候Instruments的启动按钮是启动不了的,这怎么办呢,有大神给提供了一种解决方案:Instruments启动按钮不可点。http://www.huangyibiao.com/archives/630(在这里谢谢标哥大神,虽然你也不看我的博客哈哈)
大概的解决方案就是:各种重启。手机关机、重启,同时将Xcode关掉,然后重新打开Xcode,然后重新将手机与电脑连接,再打开Instrument,点击Core Animation,切换到当前的手机,发现可以正常点击了。
在这里有必要说一句,这19个性能检测的工具,有的可以在模拟器上边进行检测,有的是不可以的。如果选择使用ios模拟器,那么它监控的就会是你的mac,和真机还是有区别的,譬如这个电池就应该用真机检测,模拟器的电池没啥可测的。而我们的目的是手机app,当然,所有的项目都是都可以在真机上检测的。建议大家尽量在真机上用Istrunments。下边我们就逐一看看这19个性能检测是怎么操作的,到底怎么就检测了呢,检测出来的都是什么东西呢,会得到什么样的结果呢,我们拭目以待。
1、Blank:
空白的,没啥可说的。
2、Activity Monitor 活动监视器:
监测CPU、内存、硬盘和网络使用情况,还能检测所有的进程,检测父/子进程的层次。默认情况下显示:虚拟内存大小,cup总使用量,cup用户所使用的占用比,cpu系统使用占用比。推荐学习小白学习Activity Monitorhttp://www.jianshu.com/p/445ef0f3cfb3。
第1部分是profile的表头,启动、暂停、项目名称、运行时间等等信息都可以在上边找到。
第2部分是左边是性能检测的项目名称,右边以竖形条形式展示运行过程中数据值的大小,比较直观。
第3部分是具体的性能数值,可以选择Details(详细信息)和Console(控制台),可以看到具体的详细信息。
3、Allocations 分配:
(!!重点之一来了!!来得如此之快,还叫人有些不适应呢)
为什么我们要使用这个Allocations,参考Alloactions简单使用。文章中介绍了原因:http://www.jianshu.com/p/680d65d974de
Allocations 的页面如下所示:
1:堆区内存和虚拟内存占用图
2:堆区内存占用图
3:虚拟内存跟踪图
4:选择使用不同的形式展示内存占用情况
5:勾选让上面曲线图展示对应内存占用情况
6:持久分配的内存所占字节数(未释放)即该类对象在内存中占得总内存
7:持久创建的对象个数(未释放)即该对象存在于内存中的个数
8:临时分配的对象个数(未释放)即存在过已经被回收的对象的个数
9:分配的所有内存所占字节数(未释放)
10:创建的对象总数(未释放)
11:设置面板,不同的设置使左边有不同展示效果
如上图并不能很好的了解每个方法所占用的内存情况,接下来我们点击4的call Trees如下图设置:
接下来我们根据内存泄漏的情况对内存分配进行分析,内存泄漏分两种:
第一种:为对象A申请了内存空间,之后再也没用到A,也没有释放A导致内存泄漏。这种是Leaked Memory内存泄漏。
第二种:类似于递归,不断的申请内存导致的内存泄漏。根据下边的链接文章我们知道这种情况就是Abandoned Memory被遗弃的内存。
说到这里大家可以去看看这篇文章iOS Instruments,名字虽然起的很一般,但是讲了Allocations的前因后果。当然,下文我也拿来借鉴了。在此,谢谢文章作者luobs。
第二种情况根据以下图的操作可以清晰的找到对应的问题代码,当然不一定是我们自己代码的原因,也有可能是系统框架的问题。
该方法笔者没有亲测,但是看着挺可靠的,具体的步骤告诉了,按照步骤一步一步的走下来应该就能找到被遗弃的内存(看到这个“被遗弃”的词,就想起了《纪念碑谷》)
4、Automation:自动化
UI 自动测试是iOS 中重要的附加功能,它由名为“Automation”的新的工具对象支持。Automation工具的脚本是用JavaScript语言编写,主要用于分析应用的性能和用户行为,模仿/击发被请求的事件,利用它可以完成对被测应用的简单的UI测试及相关功能测试。
简单的说就是自己写JS脚本进行测试。(最好了解JS语言最好了,不了解的这个Automation其实有点鸡肋)
可以参考下边这篇文章借鉴他人UI Automation。http://www.jianshu.com/p/4dd99c7fdcf0
5、Cocoa Layout:自动布局
Cocoa Layout可以应用于iOS模拟器和Cocoa桌面应用,但是不能和连接的iOS设备一起使用。Cocoa Layout提供了一个与NSLayoutConstraint类的实例有关的所有事件的时间轴,这一点和回溯(backtrace)很像。
关于这项内容网上资料并不多,大家可以参考利用Cocoa Layout 检视自动布局http://www.cocoachina.com/ios/20151105/13927.html
6、Core Animation:核心动画
在网上查资料,大部分都是关于动画怎么设置的,和layer有关的动画制作,即便前面加上Instruments,查出来的也是关于动画制作的。。。也是醉了。幸好我们同事之前总结过关于这方面的,直接拿来用吧。如果大家有相关的链接,希望能给提供一下,谢谢了。
这里我们需要知道这个Core Animation是干什么的,Core Animation工具是用来检测Core Animation性能的。(看起来这句话好像说了等于没说,不过从这句话里面我们可以看出加粗的Core Animation是我们网上查到的利用iOS做的动画,而前面没有加粗的是咱们Istruments里面的Core Animation工具)
首先我们了解什么是FPS。FPS:一秒钟渲染多少帧 Frame Per Second = FPS。
Core Animation给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画,界面滑动FPS可以进行测试。一般FPS是60左右,过于低的话需要进行优化。根据下图我们会发现,过于低的数值是低于45。
....
文/和珏猫(简书作者)
原文链接:http://www.jianshu.com/p/9e94e42cfb01
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。