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
一、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;
}
复制代码