背景
当app经过一段儿时间的迭代,往往会出现一些性能问题,这时能够协助开发同学解决这些性能问题也成为我们测试同学的重要工作。凑巧最近一段时间小编就一直在协助开发同学去进行app内存优化。这里小编整理了一份关于内存优化的心得分享给大家。
目的
首先我们先要明确我们的目的,在保证程序运行流畅的前提下尽可能的优化使用内存。所以千万不要掉进为了优化而优化的陷阱。程序要先保证能运行,然后再谈良好运转。所以解决问题比较宽泛,必要的时候在交互或者运转机制上小动刀子来保证既能完成任务,程序又能正常运转,不必去对代码进行完全重构。毕竟在优化效率达到上限的时候,只能用时间换空间了。
iOS内存常见问题
- 内存泄漏
- 内存瞬时增幅过高
- 内存异常使用
内存泄漏
我们最容易遇到的问题主要就是内存泄漏,泄漏的内存一点点蚕食我们剩余的内存资源,最后导致资源耗尽系统卡死或者崩溃。而内存泄露的实质是堆区的内存被分配之后,没有在使用完成之后,在适当的时候被释放掉。比如下面代码(主要是循环引用):
- (void)viewDidLoad { [super viewDidLoad]; // 此处会发生内存泄露,因为self 添加了全局 block,self 对此 block 存在强引用。 [self executeBlock2:^{ self.index = 1; }];} - (void)executeBlock2:(dispatch_block_t)block { // 这个 _block 全局变量就是内存泄露的原因 _block = block; if (block) { block(); }}
当整个代码形成了一个强引用的持有链条(对象a强引用对象b,对象b强引用对象a),这一组内存就被持续占用了,所以有些App如果做的很差,用户就会发现自己越用越卡,经常内存溢出甚至导致设备重启,罪魁祸首就是内存泄露过多,当App占用过高的内存,直接被系统kill,亦称低内存崩溃。上面代码中主要是内存泄漏的一直主要原因,如果想知道解决方案可以去查找循环引用相关资料。
内存瞬时增幅
在一些使用场景里,比如整个页面初始化,要分配整个使用内存,批量的图片处理,会出现一段时间内需要加载大量内容,占用过高的内存。而iOS的低内存机制就是给你一个阈值,只要你的APP超过这个数值,哪怕只是一瞬间也会直接崩溃。因此我们就需要对这种瞬间的高增幅去进行优化。如果我们发现单纯的降低内存使用行不通时,我们就需要用时间去换空间,拉长整个加载步骤。
- 懒加载
- 灵活运用图片和文件加载
- 拉长文件处理机制,逐步处理文件
内存使用异常
这个问题也容易理解,比如我们在处理文件时,假如遇到一个大文件,我们在使用过程中就要避免将其整体读入内存中,尽量按照固定长度或者逐行去进行操作,同理对于内存空间的申请时,我们也要尽量做到够用即可,切记不要只顾自己爽而忘了整体,多余的内存申请既提升不了代码质量和执行效率还会造成很多资源浪费,提高APP遇到低内存崩溃的概率。还有就是在iOS开发时不要用xib来拖拉控件,很多的xib会特别大的增加App的内存,在优化内存的时候,不妨把xib文件删除选择全代码来开发。也可以节省很多内存。
总结
内存的优化方式除了上面说的几种还有更多有待发现,我们虽然作为测试同学,但是在这种优化时刻还是需要积极参与,毕竟优化重构这种改动总是会引起很多毁灭性BUG,只有我们脑中存在这些知识才能更好的判读改动范围,更好的去进行测试,守住APP的底线。