用途
- 一句话概括其常用:“内存开销、运行速度、内存泄漏 and so on”
打开Instruments的常用的几种方式
Xcode > Open Developer Tool > Instruments
Product > Profile
长按启动按钮>弹出的菜单中选择Profile
快捷键 (cmd + i )
常用功能介绍
Instruments 里面工具有很多,下面列出我们开发中最常用的几个功能
Time Profiler: 分析代码的执行时间,可以找出最耗时的操作(常用于排查程序变慢的原因)
Zombies: 检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
Allocations: 用来检查内存分配,写算法的那批人也用这个来检查
-
Leaks:检查内存,看看是否有内存泄漏 - MLeaksFinder
内存泄漏(Leaked Memory):未被你的程序引用,同时也不能被使用或释放的内存
废弃内存 (Abandoned Memory):被你的程序引用,但是没什么卵用的内存 - arc 模式下常常是循环引用导致
项目中如何使用
1. Time Profiler
1. 使用上面的方法打开Instruments,弹出以下界面
2. 点击箭头指向的图标,弹出以下界面
3. 点击红色按钮开始 ,弹出以下界面 一目了然有没有
4. 查看每一个方法所占用的时间
5. 面板中几个设置选项
- Separate by Thread: 每个线程应该分开考虑。只有这样你才能揪出那些大量占用CPU的"重"线程
- Invert Call Tree: 从上倒下跟踪堆栈,这意味着你看到的表中的方法,将已从第0帧开始取样,这通常你是想要的,只有这样你才能看到CPU中话费时间最深的方法.也就是说FuncA{FunB{FunC}} 勾选此项后堆栈以C->B-A 把调用层级最深的C显示在最外面
- Hide Missing Symbols: 如果dSYM无法找到你的app或者系统框架的话,那么表中看不到方法名只能看到十六进制的数值,如果勾线此项可以隐藏这些符号,便于简化数据
- Hide System Libraries: 勾选此项你会显示你app的代码,这是非常有用的. 因为通常你只关心cpu花在自己代码上的时间不是系统上的
- Flatten Recursion: 递归函数, 每个堆栈跟踪一个条目
- Top Functions: 一个函数花费的时间直接在该函数中的总和,以及在函数调用该函数所花费的时间的总时间。因此,如果函数A调用B,那么A的时间报告在A花费的时间加上B花费的时间,这非常真有用,因为它可以让你每次下到调用堆栈时挑最大的时间数字,归零在你最耗时的方法。
上面的参数在实践中合理设置,也没有什么太多技巧,就是通过数据的隐藏、显示让我们更关注于想找到的数据。
2. 僵尸对象
- (点击Zombies-->查看。这个比较简单自己看吧,下面介绍几个相关的知识点,感觉这个更有意义)
野指针与僵尸对象的关系
野指针.
C语言: 当我们声明1个指针变量,没有为这个指针变量赋初始值.这个指针变量的值是1个垃圾指 指向1块随机的内存空间。
OC语言: 指针指向的对象已经被回收掉了.这个指针就叫做野指针.-
僵尸对象
- 内存回收的本质.
申请1块空间,实际上是向系统申请1块别人不再使用的空间.
释放1块空间,指的是占用的空间不再使用,这个时候系统可以分配给别人去使用.
在这个个空间分配给别人之前 数据还是存在的.
OC对象释放以后,表示OC对象占用的空间可以分配给别人.
但是再分配给别人之前 这个空间仍然存在 对象的数据仍然存在.
- 内存回收的本质.
僵尸对象: 1个已经被释放的对象 就叫做僵尸对象.
使用野指针访问僵尸对象.有的时候会出问题,有的时候不会出问题.
当野指针指向的僵尸对象所占用的空间还没有分配给别人的时候,这个时候其实是可以访问的.
因为对象的数据还在.
当野指针指向的对象所占用的空间分配给了别人的时候 这个时候访问就会出问题
所以,你不要通过1个野指针去访问1个僵尸对象.
虽然可以通过野指针去访问已经被释放的对象,但是我们不允许这么做.僵尸对象检测.
默认情况下. Xcode不会去检测指针指向的对象是否为1个僵尸对象. 能访问就访问 不能访问就报错.
可以开启Xcode的僵尸对象检测. 那么就会在通过指针访问对象的时候,检测这个对象是否为1个僵尸对象 如果是僵尸对象 就会报错.为什么不默认开启僵尸对象检测呢?
因为一旦开启,每次通过指针访问对象的时候.都会去检查指针指向的对象是否为僵尸对象.
那么这样的话 就影响效率了.如何避免僵尸对象报错.
当1个指针变为野指针以后. 就把这个指针的值设置为nil
僵尸对象无法复活.当1个对象的引用计数器变为0以后 这个对象就被释放了.
就无法取操作这个僵尸对象了. 所有对这个对象的操作都是无效的.因为一旦对象被回收 对象就是1个僵尸对象 而访问1个僵尸对象 是没有意义.
3. Allocations (内存分配)
4. Leaks (检测内存泄漏)
- 选中Leaks 如果有内存泄漏会出现图中 “红X”
使用中常常在1,2 中快速定位,出现内存泄漏的位置。其实,我们也可以通过观察内存的变化情况(反复进入和退出一个页面)来判断,如果内存持续飙升,说明内存泄漏了。
- 查看泄漏中的代码
双击进入查看内存泄漏处
关于 iOS7 以上版本出现的ASI内存泄漏请参考
http://msching.github.io/blog/2014/05/04/leak-of-asihttprequest-on-ios7/?utm_source=tuicool&utm_medium=referral