iOS内存泄露检测方法

在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宏来控制。

你可能感兴趣的:(iOS内存泄露检测方法)