欢迎关注我的微信公众号“鱼在云中游”(hcytalk)。

对于检测iOS应用中的内存泄露,我们经常会用到Xcode自带的Instrument工具Leaks,但是Leaks使用起来不是很方便,对于初学者也很不友好,太多的信息需要筛选,还经常用着用着就检测不了得重启系统,让人不是很舒服。

所以今天介绍一下Github上的一个第三方iOS内存泄露检测工具MLeaksFinder,地址https://github.com/Tencent/MLeaksFinder,腾讯出品。

MLeaksFinder使用起来非常简单,只需要把它引入到你的项目里,一句额外的代码都不用加,只要应用跑起来了,它就会自动帮你检测有没有内存泄露。

MLeaksFinder的代码没有侵入性,这意味着你不用为了引入它而修改你原有的项目代码,甚至连发正式版都不用移除掉,因为它只在debug版本里起作用。

自动检测并弹框提醒,无需打开额外的检测工具,代码没有侵入性,无需一个个场景去重复操作,这就是MLeaksFinder的魅力所在。它默认只检测应用里UIViewController和UIView对象的泄露情况,因为一般应用里内存泄露影响最严重的就是这两种内存占用比较高的对象,它也可以在代码里设置扩展以检测其他类型的对象泄露情况。

如下面是被检测出有内存泄露时系统控制台输出的信息,同时应用内也会弹出对话框提示已有内存泄露发生。如下提示表示当前栈从上往下看,最后一个对象也就是MyTableViewCell的对象没被释放,在它之上的三个其他对象已经成功被释放了。

原理

一般情况下,当一个UIViewController被pop或者dismiss掉后,它的view和view的subview等也会很快地被释放掉,除非我们把它设置为单例或者还有强引用指向它。MLeaksFinder的做法就是根据这种基本情况,在一个UIViewController被pop或者dismiss掉3秒后,看看它的view和view的subview等是否还存在,如果还存在,就意味着有可能有内存泄露发生,弹框提醒用户。

循环引用链

看到这里你可能会问,MLeaksFinder虽然能帮我找到了泄露的对象,但是找到了之后却没告诉我应该怎么修改。

我们都知道,一般的内存泄露如果不是自己故意用强引用指向泄露的对象,那泄露的原因很有可能就是代码中出现了循环引用。MLeaksFinder只是帮用户找出了泄露的对象,却没有找出导致泄露的循环引用链条,用户还是得去看自己写的可能已经很久了的代码,然后花费很长的时间和功夫来找出为什么这个对象会销毁不了,想想就觉得不如放弃了,心寒。

其实山人自有妙计,我们会遇到的问题相信其他的开发者早就遇到过了。

Facebook在Github开源了一个用来检测循环引用的工具FBRetainCycleDetector ,地址https://github.com/facebook/FBRetainCycleDetector。使用这个工具可以传入应用内存里的任意一个Objective-C对象,FBRetainCycleDetector会查找以该对象为根节点的强引用树中有没有循环引用。

所以查找内存泄露现在一般是两个工具一起用,先用MLeaksFinder找出泄露的对象,然后再用FBRetainCycleDetector检测该对象有没有循环引用,如果有,根据找出来的循环引用链条去查看修改代码就方便很多了。

如下图是FBRetainCycleDetector检测出来的循环引用信息,这些信息表示MyTableViewCell对象有一个强引用指向对象_callback, _callback是一个__NSMallocBlock__类型的对象,_callback里又强引用了MyTableViewCell对象,这就是一个循环引用链。

看完这篇文章,是不是觉得以后查找内存泄露变得很easy了?

写于2018年4月7号。

iOS 内存泄露检测工具MLeaksFinder和FBRetainCycleDetector相关推荐

  1. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  2. MLeaksFinder :腾讯开源的 iOS 内存泄漏检测工具

    一.工具简介 MLeaksFinder :腾讯开源的 iOS 内存泄漏检测工具 工具优势:在日常开发调试或测试业务逻辑过程中,可以自动发现并警告内存泄漏.暂时没有发现误报:基本上报了leak的  进去 ...

  3. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

  4. Visual Studio内存泄露检测工具

    使用简介 在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的.诚然,我们可以借助一些工具,而且我们还会惊奇地发现这 ...

  5. 几种内存泄露检测工具的比较

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  6. memwatch内存泄露检测工具

    工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...

  7. 内存泄露检测工具比较

    From: http://blog.163.com/zhuang_qianxin/blog/static/29765138201051092529107/ 1.     ccmalloc-Linux和 ...

  8. 内存泄露检测工具VLD相关配置

    参考链接: VLD(Visual LeakDetector)内存泄露库的使用 VS2019编译 内存泄漏检测工具VLD 一.源码下载 源码下载链接:https://github.com/KindDra ...

  9. linux 内存泄露检测工具——valgrind

    valgrind是linux下一个可用调试.查看内存泄露的工具,其官方网站:http://www.valgrind.org/ 使用时可用命令: valgrind -v  --leak-check=fu ...

  10. kmemleak的使用---内存泄露检测工具【转】

    转自:http://blog.csdn.net/lishenglong666/article/details/8287783 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 内 ...

最新文章

  1. 美国限制研究生入境,港大神操作,只要你愿意,填个表就行,还有机会获得校长奖学金...
  2. java基础练习题目
  3. python读取txt文件并批量写入不同的excel
  4. 从GWT开发人员的角度概述Scala.js
  5. creo管道设计教程_Creo产品设计教程:握力器弹簧建模,一个技巧轻松搞定
  6. LabView中,下拉列表和枚举有什么区别?
  7. 文本文件与0、1文件
  8. vue-aliplayer 阿里云播放器适配 vue [新]
  9. 基于词典方法和机基于器学习方法的中文情感倾向分析(Web)
  10. 代码女神利用Python网络爬虫爬取淘宝评论区数据(用小本本记下来)
  11. kill the one(pjone歌词摘录)
  12. HDU6438-Buy and Resell(贪心、思维题)
  13. 业务复习-微信登录/第三方登录实现
  14. 矩阵旋转(翻转)刷题总结
  15. Quartus TCL
  16. RBF神经网络简单介绍与MATLAB实现
  17. 实现74HC85的功能以及16位数值比较器
  18. [福禄克] Fluke同轴电缆测试模块DSX-CHA003 COAX
  19. 用户在电商网站中购买成功了,那么它在微服务中经历了什么(转)
  20. java 装配模式_java23种设计模式代码 Java装配模式

热门文章

  1. SpringSecurity实战(六)-集成图形验证码-自定义认证实现
  2. 如何强制解锁或删除被占用的文件或文件夹 - ForceDelete绿色强制文件删除工具
  3. ftp服务器怎么删文件夹,删除ftp服务器文件夹
  4. Java毕业设计-快递物流管理系统
  5. 【论文笔记】Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
  6. 面向Java程序员的Scala教程
  7. nvidia控制面板点了没反应win7_nvidia控制面板点击没反应 - 卡饭网
  8. java幻灯片效果_java实现多种幻灯片切换特效(经典,附源码)
  9. android4能用otg吗,小米4支持OTG吗?小米4手机的OTG功能怎么用?
  10. TXT文件导入mysql