iOS内存处理问题一直是一个比较头疼的问题,有时候面试的时候也会被问到,检测内存泄漏可能大家都会想到Instruments。但是有一个库,非常方便的能检测出内存泄漏。这个库就是MLeaksFinder,GitHub上面可以搜到。
MLeaksFinder
简单介绍一下MLeaksFinder。
官方解释:
具体的方法是,为基类 NSObject 添加一个方法 -willDealloc 方法,该方法的作用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言。
核心代码:
-(BOOL)willDealloc {
__weak id weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf assertNotDealloc];
});
return YES;
复制代码
}
-(void)assertNotDealloc {
NSAssert(NO, @“”);
复制代码
}
这样,当我们认为某个对象应该要被释放了,在释放前调用这个方法,如果3秒后它被释放成功,weakSelf 就指向 nil,不会调用到 -assertNotDealloc 方法,也就不会中断言,如果它没被释放(泄露了),-assertNotDealloc 就会被调用中断言。这样,当一个 UIViewController 被 pop 或 dismiss 时(我们认为它应该要被释放了),我们遍历该 UIViewController 上的所有 view,依次调 -willDealloc,若3秒后没被释放,就会中断言。
安装:
安装非常简单,直接在Podfile中添加pod 'MLeaksFinder',你不需要在任何文件中引入头文件,执行pod install就行了
案例:
在iOS中,比较常见的内存泄露场景就是循环引用。作为一个iOS工程师,应该时刻警惕循环引用带来的问题。然而在赶工或者稍有不慎的情况下,还是会出现一些有问题的代码。 对于Xcode来说,编译器会对编写代码中明显的循环引用进行提示,比如对于self.property持有的block中,使用self,Xcode就会显示警告。
但是有些你不注意的情况下,Xcode有的就不会警告。
在这个控制器被pop后,MLeaksFinder立刻就弹出了弹窗
找到泄漏的地方改成弱引用 __weak typeof(self) weakSelf = self;
至此,MLeaksFinder的简单使用就介绍完了,真的十分简单就找到了一些潜在的问题,对于工程几乎0入侵,强烈推荐使用。