iOS 调试神器Instruments查找内存泄漏
在日常的开发中总会不经意的留下一些小问题,这些小问题在写的时候并不会造成什么致命bug,但代码多了或者合并了其他的代码之后,就会引起比较严重的问题了,而且这些问题是非常难定位,编译工具并不能完全的反应这些问题,尤其是Objective-C这种语言,所以我们在代码审查阶段就可以使用这个工具了Instruments ,通过它可以查找到一些性能的损耗以及内存生成和释放的的相关问题。
它在xCode的Open Developer Tool 里面。
一般情况下我们启动它都是看到以下的界面:
1、Instruments 所包含的调试工具如下:
类型 | 功能 |
---|---|
Blank | 这是一个空白模板,可以进入调试后自定义添加各种其他的模板 |
Activity Monitor | 监视进程和系统的CPU,内存磁盘和网络使用情况统计信息 |
Allocations | 跟踪进程的匿名虚拟内存和堆,提供类名并可选择保留/释放对象的历史记录 |
Core Animation | 此模板通过时间分析测量应用程序图形性能以及进程的CPU使用情况 |
Core Data | 此模板跟踪Core Data文件系统活动,包括提取缓存未命中和保存 |
Counters | 使用基于时间或事件的采样方法收集性能监视器计数器(PMC)事件。 |
Energy Log | 该模板提供有关电池🔋使用以及主要设备组件的基本开/关状态的诊断。 |
Field Activity | 此模板监视文件和目录活动,包括文件打开/关闭调用,文件权限修改目录创建文件移动等。 |
Game Performance | 了解对游戏性能和平滑帧速率至关重要的关键性能区域 |
Leaks | 测量一般内存使用情况,检查泄漏的内存,并按类提供对象分配的统计信息,以及所有活动分配和泄漏块的内存地址历史记录。 |
Metal System Trace | Metal System 跟踪通过提供来自应用程序,驱动程序和GPU层的跟踪信息来描述ios,tvOS和macOS Metal应用程序的性能 |
NetWork | 监听应用程序在工作时的网络吞吐量 |
ScreenKit | 描述应用程序对ScreenKit的使用。确定进入每个帧的工作类型,例如动画,物理场景剔除和读取 |
System Trace | 全面了解操作系统中发生的情况。 了解如何跨CPU分析线程,并了解系统调用和虚拟内存故障如何影响应用程序的性能 |
System Usage | 此模板记录与文件套接字和共享内存相关的I / O系统活动,用于通过仪器输入启动的单个进程,为每个调用提供输出持续时间回溯调用树等。 |
Time Profiler | 执行低开销的基于时间的采样或在系统的cpu上运行的进程 |
Zombies | 测量一般内存使用情况,同时专注于检测过度释放的“僵尸”对象。还提供按类分类的对象分配统计信息以及所有活动分配的内存地址历史记录 |
2、从模板到应用
2.1 内存泄漏相关问题的定位
内存泄漏大致分为以下几种类型
Block的循环引用
delegate 循环引用
NSTimer 循环引用
非OC对象的内存处理
地图类处理
大数目计算循环内存暴涨的问题
先从工程中启用Profile选项启动 Instrument
然后选择Leaks
我们先往viewDidLoad里面添加一些内存申请,然后不释放
@implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
for (int i = 0; i<100; i++) {
char *k = malloc(12);
memset(k, 0x12, 12);
printf("%s\n",k);
}
}
运行时,我们就能发现其内存泄漏发生的地方了:
这为我们节省了大量的时间去查找问题所发生的点,实战利器。