在iOS开发中,检测内存泄露一般有如下几种方法:
1、通过Xcode中Product->Analyze静态分析代码,找出潜在的内存泄露。
2、使用Xcode自带工具Instruments来检测内存泄露。
方案1的优点是不需要写代码,只需要运行一次,就能检测出潜在的内存泄露;缺点是由于是静态代码检查,无法覆盖全部场景(比如动态运行场景),有可能误报。
方案2的优点是不需要写代码,直接运行Instruments工具进行检测,适用于开发、测试来使用;缺点是需要一个一个页面去点击。
那么有没有更好的内存泄露检测方法呢?如果我们在开发的过程当中就能及时发现内存泄露,并且修改之,从根源上杜绝内存泄露,岂不快哉?这里推荐一下微信读书开源的内存泄露检测库MLeaksFinder,MLeaksFinder具有如下功能:
1、能检测出内存泄露和循环引用,并且弹框提醒。
2、只在Debug模式下起作用,Release不起作用。
3、支持检查VC和View里面任意对象的内存泄露。
MLeaksFinder的实现原理可以参考如下文章:MLeaksFinder 新特性。MLeaksFinder:精准 iOS 内存泄露检测工具。一些关键的实现点如下:
1、如何检测内存泄露?
MLeaksFinder认为在viewDidDisappear调用之后,过2s后,VC、它的childViewControllers、presentedViewController、VC的view及view的子view肯定要立即销毁。通过hook掉UIViewController的viewDidDisappear、viewWillAppear、dismissViewControllerAnimated方法以及UINavigationController的pushViewController、popViewControllerAnimated、popToViewController、popToRootViewControllerAnimated方法来实现。
2、如何检测retain cycle?
采用facebook开源库FBRetainCycleDetector检测。
3、如何建立VC的堆栈信息
需要构建 View-ViewController stack 信息以告诉开发者是哪个对象没被释放。在递归遍历 View-ViewController 树时,子节点的 stack 信息由父节点的 stack 信息加上子结点信息即可。
4、如何控制只在Debug模式起作用?
通过MEMORY_LEAKS_FINDER_ENABLED和MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED宏来控制。