在iOS开发中,有时候打开某个页面程序会出现内存激增的现象,这有可能是对象的内存没有得到及时释放,也或者是代码块占用内存较高造成的,但是当这个页面关闭后,内存会随着页面的生命周期一起释放。所以我们如何定位到造成内存激增的问题代码呢?
这种内存问题用Leaks是找不出来问题的,因为这些内存其实只是释放不及时,而不是没有释放
解决方案
使用Instruments Allocations的Mark Generation功能能帮助我们排查出这种问题。
使用技巧说明
- 调试内存可以用Debug模式来调试,但是记得在工程设置中把Debug模式的Debug information Format设置成:DWARF with dSYM File,要不然的话在instruments中是无法看到内存增加对应的我们自己代码的。
- 用真机,先用真机连着xcode启动,然后在点击instruments中的开始(找到对应的工程)。
操作步骤
1.启动Allocations
在xcode中启动instruments中的Allocations,如下图
2.真机连上xcode,运行程序
运行前记得把Debug模式的Debug information Format设置成:DWARF with dSYM File,如下图
3.运行Allocations
4.做标记,做对比
通过点击界面下方的Mark Generation
按钮,给当前位置做标记。具体操作步骤是这样的,程序刚进来的时候,先等一下界面初始化完成,过了几秒后,点击一下标记,上面会有一个小红旗表示做了标记,然后我们点击我们的app其他界面或者其他功能,看到内存变大了觉得有情况的话,就再点击一下做个标记。我在这里做了三个标记,如下图,可以看到c标记
相对于b标记
内存很明显的增长了(因为我这里是以demo为例子的,demo没什么东西,所以这几兆算是很大的增长了,反复点的话会更多,具体代码下面会说)。
点击c标记
右侧的小箭头,然后跳转到详情分析页面,如下图:
在这里我们在call tree里面将系统方法隐藏掉,同时勾选第一个按照类分割,然后上面详情里会出现。
可以看到最上面的堆内存占用了4.78M,排在第一位了,点开main里面的函数,如下图:
可以看到内存激增的方法了。
如上,用这种方法可以检查一下自己项目的内存使用状况,提高我们app的质量。