MLeakFinder使用总结及白名单

MLeaksFinder 是WeRead团队开源的一款检测 iOS 内存泄漏的框架,其使用很是简单,只需将文件加入项目中,若是有内存泄漏,3秒后自动弹出 alert 来捕捉循环引用。使得能够在开发快速找到80%内存泄漏,而使用 Xcode Leak 工具更适合大范围的,所有的寻找泄漏点。git

在你的iOS应用程序在开发阶段,MLeaksFinder能够帮你找到内存泄漏问题。它能够在UIView和UIViewController对象中自动发现泄漏,当内存泄漏时,会自动断点和打印出View-ViewController堆栈中的泄露对象。你也可使用它检测其余类型对象的内存泄漏问题.github

内存泄露缘由总结

ARC工程是能够重写dealloc方法,并且当对象被释放时会被调用,但不须要手动调用父类的dealloc,当调用[super dealloc]方法时会报错,由于系统会自动帮咱们调用父类的dealloc方法,不须要重写; 但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是由于当前控制器被某些对象 强引用 了,控制器的引用计数不为0,系统没法自动释放这部份内存,致使控制器也不能主动释放。web

特性

经过阅读 MLeaksFinder 的介绍能够看出其具备如下几个特性bash

  1. 无侵入性
  2. 能够构建泄漏堆栈
  3. 白名单机制
  4. 拓展性
  5. 其余一些特殊处理
控制器被强引用的缘由:

一、block块使用不当,致使循环引用。 由于block会对方法中的变量自动retain一次。 引用外部变量须要使用 __block 调用self 须要 __weakapp

二、NSTimer没有销毁 在viewWillDisappear以前, 须要把控制器用到的NSTimer销毁.框架

由于 target:self,也就是引用了当前viewController,致使控制器的引用计数加1,若是没有将这个NSTimer 销毁,它将一直保留该viewController 没法释放,也就不会调用dealloc方法。因此,须要在viewWillDisappear以前须要把控制器用到的NSTimer销毁。工具

销毁方法:ui

[timer invalidate]; // 销毁timer
timer = nil; // 置nil

复制代码

三、viewController中的代理不是weak属性 例如代理要使用弱引用atom

@property (nonatomic, weak) id delegate;
复制代码

由于代理是被控制器强引用的,因此本身须要使用weak弱引用spa

等还有一些状况吧。


可是在一些状况下,好比自定义的一些类,webBridge状况时,都会遇到明明找不到没有释放的问题,却仍是顽固的显示,这就很不友好了,这种状况下就须要咱们一些特殊处理了::

例外机制(白名单)

对于有些 UIView / UIViewController,在被 pop 或 dismiss 后,不会被释放(好比单例),所以须要提供机制指定哪一个对象不会被释放。

1.重载该类的 -willDealloc 方法,直接 return NO。适用于自定义的类。

- (BOOL)willDealloc {
    return NO;
}
复制代码

2.添加类名白名单。适用于非自定义的类。

[NSObject addClassNamesToWhitelist:@[NSStringFromClass([self class])]];
复制代码

扩展

MLeaksFinder 能够被扩展,用来查找除了UIView/UIViewController以外的其余类的循环引用。

例如检测UIViewController中的viewModel属性是否释放:

- (BOOL)willDealloc {
    if (![super willDealloc]) {
        return NO;
    }

    MLCheck(self.viewModel);
    return YES;
}
复制代码
相关文章
相关标签/搜索