j9九游会登陆--首页直达

谈谈iOS内存泄漏
  • 智网科技
  • ###
  • 分类: 履历之谈
  • 阅读量: 75

内存泄漏题目是每个app都必需存眷的题目,干系到线上的波动性和功能。内存泄漏会招致:

  • 由于内存资源不敷产生难以排查的线上bug

  • 由于被泄漏工具的存在招致的一些商业bug,好比泄漏的工具仍在承受全局关照

  • 功能题目,招致用户利用app时越来越卡

内存泄漏发明分红静态扫描和运转时检测,本文次要讲运转时检测。

静态扫描

静态扫描的东西:

  • xcode analyzer

  • OCLint

  • Infer

运转时静态检测

由于静态扫描不克不及发明一切的内存泄漏题目,以是活动时检测是必不行少的。

Allocation

Xcode的Allocation可以经过比力差别工夫段的工具,剖析出能否产生了内存泄漏。但条件是每个页面的定名要切合标准,好比宝物概况页的一切工具都是使用前缀+宝物概况页眼前缀+详细工具名,如许才加入页面的时分才干晓得响应的工具能否被开释了,由于stack最底部的页面的工具常驻在内存中。

Allocation经过和Monkey共同,在回归测试的时分,主动运转并经过盘算内存占用率可以判别出新的开辟版本能否产生了内存泄漏,但无法晓得详细是哪个工具没有开释,只能是全局的判别。

MLLeaksFinder

十分适用的内存泄漏反省东西,次要原理是UINavigationController在pop页面的时分,可以展望出被pop的页面将被开释,以是在一段工夫后(3s)对这个工具举行断言判别,假如没有被开释的话步伐就会中缀,还可以扫描view hierarchy,大概自界说扫描必要的工具。

相比Allocation,最大的利益便是

  • 实时发明正在开辟的页面能否产生了内存泄漏,实时排查,而不是在回归测试的时分才发明

  • 假如使用中的每个页面都有响应设置装备摆设的URL scheme的话,那么把一切页面的url写在设置装备摆设文件中,在回归测试的时分,代码里主动push每个url的页面,可以做到完备地回归一切页面,又免除了Allocation手动点击各个页面的繁琐。

  • 假如嫌MLLeaksFinder代码太多,可以本人完成一个精简版的,原理比力复杂,代码写起来很少。

怎样排查

上述的种种办法发明了内存泄漏后,排查并办理才是最要害的一步。依据泄漏的工具,重点排查block和两个以上工具循环援用的状况。

假如是ViewController产生内存泄漏,重点检察ViewController内里的block能否遗忘声明weak了,由于ViewController被其他工具持有的状况不罕见。假如是用RAC的话,记得weakly和strongly要成对呈现,不然会产生内存泄漏。

最常产生的是View的内存泄漏题目,起首检察是产生内存泄漏的view之间能否有delegate的干系,假如有的话看看delegate属性有没有声明weak

由于service大概读取缓存等异步操纵惹起的内存泄漏题目

总结

内存泄漏题目次要照旧靠编码时的标准,静态扫描能办理一局部题目,静态扫描是最初的包管。而排查内存泄漏履历很紧张。