序言:最近优化一个前辈留下来的代码,发现在进入到相关功能模块后,程序内存急剧增加,遂决定对其进行优化一下,也好久没有写博客了,觉得这个题材也不错,特以此更新一篇博客~~~
因为该内存增加的路径是可以比较容易复现的,所以打算运用Xcode自带的Instruments工具进行定位和优化。
- 1、 打开Instruments后,选择Allocations启动;
Snip20171126_1.png
Snip20171126_2.png
- 2、 点击左上角的开始按钮(红色的小圆点)后,App自动启动,开始按该issue的复现路径进行操作,同时监控Allocations窗口;
Snip20171126_3.png
Snip20171126_5.png
从监控窗口可以看到,内存分配一直处于持续增加,而没有相应释放的意思,问题可能就在这里,所以点击左上角的暂停按钮,开始进行问题查找;
- 3、 在下方窗口中选择CallTree(参看下图),对内存占用最多的调用树进行逐级展开,进行查找具体的函数调用;
Snip20171126_9.png
很快就可以看到用户自定义的熟悉的函数,这样基本就可以定位到问题方法了,这是需要回到我们的源代码进行分析;
- 4、查看源代码后很快就发现了问题所在;
Snip20171126_10.png
这是一个自定义的方法,方法内部是进行了绘图操作
Snip20171126_11.png
外加上这是一个循环内部的操作,这就很确定已经找到问题所在了。
- 5、 接下来就是进行问题修复了,这里我试了两种方法
第一种就是通过Autoreleasepool进行内存管理,对每个循环中分配的内存进行及时地回收;
Snip20171126_13.png
第二种方法是摒弃绘图方法,采用其他方法达到这项功能
Snip20171126_14.png
- 6、两种方法分别对应的效果可以再用Allocations进行确认;
Snip20171126_15.png
Snip20171126_16.png
由此看出两种方法都是效果明显了。
PS:看到这篇文章的朋友可以在下方回复优化效果的两张照片分别对应两种优化方法的哪一种呢 _
网友评论