iOS内存处理问题一直是一个比较头疼的问题,有时候面试的时候也会被问到,检测内存泄漏可能你们都会想到Instruments。可是有一个库,很是方便的能检测出内存泄漏。这个库就是MLeaksFinder,GitHub上面能够搜到。面试
MLeaksFinderspa
简单介绍一下MLeaksFinder。指针
官方解释:code
具体的方法是,为基类 NSObject 添加一个方法 -willDealloc 方法,该方法的做用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,经过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要做用是直接中断言。cdn
核心代码:对象
-(BOOL)willDealloc {blog
__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 {get
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入侵,强烈推荐使用。