欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

【iOS性能优化】MLeaksFinder内存泄漏检测,iosmleaksfinder

来源: 开发者 投稿于  被查看 22304 次 评论:94

【iOS性能优化】MLeaksFinder内存泄漏检测,iosmleaksfinder


功能分析

MLeaksFinder 是 iOS 平台的自动内存泄漏检测工具,可以在日常调试业务逻辑时自动发现并警告内存泄漏,而无需打开 instrument 等工具。它简单方便且不入侵项目逻辑,不用写任何代码即可实现ViewController,View 的内存泄露检测,也可定制检测其他类型对象的内存泄漏问题。

原理

当一个 ViewController 被 pop 或 dismiss 之后,我们认为该 ViewController,包括它上面的子 ViewController,以及它的 View,View 的 subView 等等,都很快会被释放,如果某个 View 或者 ViewController 没释放,我们就认为该对象泄漏了。

先通过 MLeaksFinder 找到内存泄漏的对象,然后再通过 FBRetainCycleDetector 检测该对象有没有循环引用。

应用场景

发现并协助解决内存泄漏

使用 MLeaksFinder 发现内存泄漏之后,app会弹出「Memory Leak」警告框提示具体的内存泄漏信息。接着通过查看「Retain Cycle」警告信息定位具体存在的循环引用问题。

把该警告框关掉,可以继续调试业务逻辑。

发现释放不及时的视图/视图控制器

当发现可能的内存泄漏对象并弹出「Memory Leak」警告框之后,MLeaksFinder 会进一步地追踪该对象的生命周期。如果该对象最终能释放,则在该对象释放时给出「 Object Deallocated 」的 alert ,据此可推断出该对象存在释放不及时的问题,可能需要进一步优化。

应用实例

安装与使用

安装

通过CocoaPods以Debug的方式引入,避免侵入发布后的app。

pod 'MLeaksFinder', '~> 1.0.0', :configurations => ['Debug']
pod 'FBRetainCycleDetector', '0.1.3', :configuration => ['Debug']

使用

一般情况下,只需要通过Pods方式引入,不需要在主工程内添加任何代码。默认只在Debug模式下启用。

禁用

通过预先定义以下宏定义,可以禁用MLeaksFinder。

#define MEMORY_LEAKS_FINDER_ENABLED 0

例外机制

对于有些 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;
}

本文涉及到的使用场景见github上的DEMO。

参考

http://wereadteam.github.io/2016/02/22/MLeaksFinder/
http://wereadteam.github.io/2016/07/20/MLeaksFinder2/

相关频道:

用户评论