http://www.ox-holdings.com

文件夹导入项目中或者使用,虽然Leak中有Cycles&Roots来检测循环引用

摘要腾讯今日开源了业界首创iOS自动内存泄露检测工具MLeaksFinder,MLeaksFinder 是 iOS 平台的自动内存泄漏检测工具,引进 MLeaksFinder 后,就可以在日常的开发,调试业务逻辑的过程中自动地发现并警告内存泄漏。前言腾讯今日开源了业界首创iOS自动内存泄露检测工具MLeaksFinder,MLeaksFinder 是 iOS 平台的自动内存泄漏检测工具,引进 MLeaksFinder 后,就可以在日常的开发,调试业务逻辑的过程中自动地发现并警告内存泄漏。MLeaksFinder简介MLeaksFinder 是 iOS 平台的自动内存泄漏检测工具,引进 MLeaksFinder 后,就可以在日常的开发,调试业务逻辑的过程中自动地发现并警告内存泄漏。开发者无需打开 instrument 等工具,也无需为了找内存泄漏而去跑额外的流程。并且,由于开发者是在修改代码之后一跑业务逻辑就能发现内存泄漏的,这使得开发者能很快地意识到是哪里的代码写得问题。这种及时的内存泄漏的发现在很大的程度上降低了修复内存泄漏的成本。特性介绍自动检测内存泄漏和释放不及时的场景构建泄漏对象相对于 ViewContrller 的引用链以帮助开发者定位问题不侵入业务逻辑,引入即生效,无需修改任何代码或引入头文件工程主页和源码地址团队博客:

小总结

MLeaksFinder 是 WeRead 团队开源的iOS内存泄漏检测工具,wereadteam博客,GitHub。

MLeaksFinder 个人认为优势是在开发过程中自动检测 UIViewController 和 UIView 等UI对象内存泄露,及自定义是否检测 UIViewController 中强引用的 NSObject 类对象内存泄露。这样在开发调试过程中就能实际避免大部分内存泄漏并及时修正编码习惯。

iOS可能存在的内存泄露:

  • block 循环引用。当一个对象有一个block属性,而block属性又引用这个对象本身那么要造成循环引用。这个时候就用___weak声明下对象,用对象的弱引用指针。
  • 头文件相互包含。那么先在.h文件用前向引用声明,@class(类名);然后在.m文件导入#import " AHMessageCell"(类头文件)
  • 移除通知 [[NSNotificationCenter defaultCenter]removeObserver:self];、
  • 移除NSTimer
  [_timer invalidate];
    _timer = nil;
  • 移除观察者
//添加观察者
    [self addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>]
//移除观察者
    [self removeObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#>];

** timer,观察者,通知的移除。一般的开发者都是放到dealloc中,但是这样不能保证一定能够移除成功。可以更加实际情况移除,可以在viewWillAppear中添加,viewWillDisappear中移除,也可以强制移除。**

目录
  • 使用实例
  • 原理分析
  • 特性
  • 深入源码
    • 寻找释放点
    • 追踪泄露
    • 报告泄露
    • 构建堆栈信息
    • 侧滑返回特殊处理

iOS中的内存泄漏可以分为两种:

小学习

以下均转自wereadteam博客

iOS内存泄露测试:可以用xcode自带instrument工具,如:leaks、Analyze、allocation,也可以用第三方工具。

序言

MLeaksFinder 是WeRead团队开源的一款检测 iOS 内存泄漏的框架,其使用非常简单,只需将文件加入项目中,如果有内存泄漏,2秒后自动弹出 alert 来捕捉循环引用。使得可以在开发快速找到大多数内存泄漏,而使用 Xcode Leak 工具更适合大范围的,全部的寻找泄漏点。

WeRead团队博客关于MLeaksFinder的介绍MLeaksFinder:精准 iOS 内存泄露检测工具

  1. 被泄漏的内存已经没有对象对其持有,但是没有正常释放,主要是OC对象与C语言转换造成的;
  2. 被泄漏的对象没有释放是因为互相持有造成的,造成的主要场景有block、delegate、Timer、互相为对方的成员变量。
1. Leaks -> 从苹果的开发者文档里可以看到,一个 app 的内存分三类:
  • Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument). 泄漏内存应用程序没有引用的内存,不能再次使用或释放(也可以通过使用泄漏工具检测到)。

  • Abandoned memory: Memory still referenced by your application that has no useful purpose.废弃内存:内存仍然被应用程序引用,没有任何有用的用途。

  • Cached memory: Memory still referenced by your application that might be used again for better performance.缓存内存:您的应用程序仍然引用的内存,这些内存可能会再次用于更好的性能。

以上 Leaked memoryAbandoned memory 都属于应该释放而没释放的内存,都是内存泄露

一: leaks

打开Xcode7自带的Instruments

图片 1

打开Instruments

按上面操作,build成功后跳出Instruments工具,选择Leaks选项

选择之后界面如下图:

图片 2

打开leaks

到这里之后,我们前期的准备工作做完啦,下面开始正式的测试!

  • 1.选中Xcode先把程序(command + R)运行起来

  • 2.再选中Xcode,按快捷键(command + control + i)运行起来,此时Leaks已经跑起来了

  • 3.由于Leaks是动态监测,所以我们需要手动操作APP,一边操作,一边观察Leaks的变化,当出现红色叉时,就监测到了内存泄露,点击右上角的第二个,进行暂停检测(也可继续检测,当多个时暂停,一次处理了多个).如图所示:

图片 3

  • 4.下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree显示如下图界面

图片 4

找到内存泄露位置

  • 5.下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:

图片 5

监测回调函数

到这里就算基本完成啦,这里显示的就是内存泄露代码部分,那么现在还差一步:定位!

  • 6.选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处,如图所示
![](https://upload-images.jianshu.io/upload_images/1400111-c91810ad1b85d803.png)

查看回调函数
  • 7.找到了内存泄露的地方,那么我们就可以修改即可。
一 使用实例

1.直接将MLeaksFinder文件夹导入项目中或者使用pod 'MLeaksFinder'都可以

  1. ViewControllerpush进FirstViewController页面,然后在FirstViewController开启一个定时器,然后点击返回。
@property(nonatomic,strong)NSTimer *timer;- addTimer { _timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];}- updateTimer { NSLog(@"%s",__func__);}

执行结果

图片 61.gif

instruments是xcode中很强大的一个工具,虽然Leak中有Cycles&Roots来检测循环引用,但是经过手动写了个循环引用测试了一下,并没有起作用。另外可以使用Allocations中的Generations中的Mark Generation来获取当前内存中的所有的对象,然后通过在不同时刻进行Mark来进行对应,找出未释放的对象。但是此方法要对每个场景进行手动的测试,界面的数据显示也比较乱,可操作性比较低。

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。