内存管理是 iOS 里一大重要内容,经历过 MRC 时代的开发者或多或少都被引用计数折磨过,后来苹果推出了 ARC (Automatic Reference Counting),这一技术大大减轻了内存管理的工做量,也下降了因内存管理而出错的几率。但在 ARC 下仍是有一些场景会致使内存泄漏,例如循环引用、强引用再也不使用的对象。git
我写了一个 Demo 来进行下面的演示,列举了 3 种内存泄漏的场景,页面截图以下所示:github
要检测内存泄漏咱们首先想到的是用 Instruments 的 Leaks 来检测,对以上 3 种情形分别不断 push、pop 后的结果以下所示:数组
Leaks 里还有一个选项 Cycles & Roots 可以分析出有循环引用的地方,以下图所示:3d
经过以上截图咱们发现只有 block 致使的循环引用可以被 Leaks 检测出来,可是总的内存使用状况只增不减确定是有问题的,下面咱们使用 Allocations 进行更具体的分析。orm
咱们选择 Allocations 从新开始分析,和上面同样不断进行 push、pop 操做,结果以下图所示:cdn
再对比没有内存泄漏的状况:对象
经过以上对比咱们能够看出正常状况下 push 再 pop 后对应的 ViewController 就被释放了,Total 这一栏里也就不会被列出;而有内存泄漏的类会被列出,这样咱们就找出了具体的类,而后就能够针对这个类的使用状况再深刻排查可能会出现内存泄漏的地方。blog
若是要更进一步查看某一个类的引用计数状况,咱们能够打开 Record reference counts,具体操做以下图所示:内存
打开这个选项后咱们再进行前面的操做,结果以下图所示:开发
虽然使用了 ARC 后可以大大避免内存泄漏的出现,但仍是会有一些场景会致使内存泄漏,上述例子里的场景都仍是比较常见比较容易避免的,在调用链长的时候一些循环引用就比较难被发现了,所以咱们在开发完一个功能模块后使用 Instruments 系统的检测一遍是比较好的习惯。
你们也能够下载这个 Demo 用 Instruments 实际操做体验一遍,enjoy~