Leaks
Leaks 工具是一个跟踪所有由应用程序分配的内存工具,可以用来识别在应用程序里面的内存分配模式,并识别应用程序内存效率低下的地方。这是为了应用程序能够消除 内存泄露,进一步提高程序的可靠性,对于设计为长时间运行的程序尤为正确。(最新版本autorelease不会被判定为内存泄露)
Leaks Trace Template 用来测试内存使用、检查内存泄露、提供类的对象内存分配和泄露的内存的统计。它由Allocations和Leaks组成。
用Leaks工具可以发现App不再有引用指向的内存。Leaks工具提供这些内存块的报告。大部分这些内存泄露都是用类的名字来标识的,另外可能会用分配内存的大小标识。
定位泄露的内存
- 打开Leaks Template。
- 从工具栏菜单中选择你要进行检测的app。
- 点击Record按钮。
- 执行你要检查的代码的操作,当有内存泄露的时候点击Stop按钮。
- 在Detail窗口中点击被标记为泄露的内存。
- 在Extended Detail 窗口,在代码中双击选中其中的一条指令。
- 在Detai窗口中点击Xcode图标,可以在Xcode中打开你要查看的代码。
注意:如果泄露的不是一个对象,那么可能是你的API调用的时候分配了一块内存但是忘记了去释放。
如果泄露的内存是一个Object-C对象,点击选中的对象旁边的箭头,每个单独的地址将会显示每个对象retain/release的历史记录,对每一个事件都有堆栈跟踪。
引起非对象内存泄露的原因是内存的分配和释放没有保持一致,因此只能显示每个事件的堆栈跟踪。
跟踪视图的内存泄露集合了所有的内存泄露块的位置——代码中的一个错误可能导致重复执行的这段的代码的调用产生多个运行时的内存泄露。
打 开Xcode查看每个每一个产生内存泄露的代码时,内存泄露还没有被清除。Leaks工具的Detail窗口中的Cycles&Roots允许你 去查看调用循环。用ARC的时候Cycles&Roots视图是非常重要的。它可以用更高级的视图方式显示循环引用。通常的解决这些问题的关键是 就是把引用改为弱引用。
查看循环引用内存泄露
- 选择Leaks
- 在Detail面板中选择Cycles&Roots视图。
- 选择内存泄露的循环引用表。
注意:如果另一部分代码依然依赖这个消除的Bug或者这个Bug没有修改正确,那么你的App依然不稳定。
有两种方式可以运行Allocations And Leaks(同Time Profiler打开方式相似)。
一、在Xcode中的Debug中打开(第一种方式)
1)运行程序后,进入Show the Debugger navigation(红色线框区域)界面。
选中Memory(蓝色线框区域)
@1.Memory Use: 彩虹圈的8G是本机的内存,其中18.7M为IOS Simulator所占用的内存(这里的占用数据只能作为参考,实际真机占用内存可能会比这个数据要小)。
@2.Usage Comparison : 这里是本机内存的使用情况,其实TestForApp为IOS Simulator所占内存。
@3.Memory:
Duration:为IOS Simulator 运行app的实际时间;
High: 使用内存最多时的内存数量;
Low: 使用内存最低时的内存数量;
2) 点击右上角Profile in Instruments,进入Instruments界面。
这里会弹出一个对话框。
@1Restart: (重新运行项目)
@2Transfer:(将当前运行项目直接放入Instruments进行分析)
3) 点击Restart,进入分析界面。点击运行按钮,运行 一段时间后,有如下界面。
@1.Allocations: 分配的内存(被选中,区域3显示即为Allocations)
@2.Leaks: 有内存泄露的内存
@3.Details: 具体的分配和泄露内存的分析(选择Call Tree选项可以查看)
@4.Settings: 详细的设置(选择Allocations 和 Leaks设置选项不同) ,以下为Allocations的Settings
Allocations Lifespan: Allocations (所有分配的内存)
Created & Persistent (仍存在的)
Created & Destroyed (销毁的)
Allocations Type: All Heap & Anonymous VM(堆内存和虚拟机上分配的内存)
All Heap Allocations (堆内存)
All VM Regions (虚拟机上分配的内存)
4)右键点击Leaks区域,选择Call Tree 查看(Leaks 中红色部分即为内存泄露)
双击main函数
@1:红色区域有内存泄露55.33KB
@2: 绿色区域直接将arrString = nil; 项目没有使用ARC,arrString alloc后没有release,造成内存泄露。
5)修改项目后重新编译,再次进入分析界面
@1: 红色区域修改代码,重新编译;
@2: 成功运行App后不再有内存泄露。
6)查看Allocations
@1:选中Allocations
@2:选中2中的Call Tree,查看分配的内存详情。
查看Allocations方式与查看Leaks的方式基本相同
7)退出保存
@1:点击退出键,如果有运行过的项目,则会弹出保存对话框;没有运行过项目则直接退出
@2 : 保存选项
二、从Instruments中打开Allocations and Leaks
1)打开Xcode开发工具
@1: 打开Xcode->Open Develop Tool ->Instruments
2)显示如下界面
@1:下拉可以选择所有的Instruments。
3)下拉选择Leaks
@1: 双击Leaks,显示如下界面