自动化检查 UIViewController 中的循环引用

目的

平时开发 iOS 应用时,有时候一不留神就可能在 UIViewController 中留下循环引用,所以我写了一个叫 WCRetainCycleChecker 的工具,专门用来简单快捷的检查 UIViewController 中的内存泄漏

原理

WCRetainCycleChecker 的原理如下:

  1. Method Swizzling UIViewController.viewDidDisappear
  2. UIViewController.viewDidDisappear 执行后,再经过 4 秒,检查该 UIViewController 是否为空,若不为空,是否属于有用的 UIViewController
  3. 若该 UIViewController 不为空,且无用,则认为该 UIViewController 可能因循环引用而滞留在内存中,进行警告

使用

集成

1
pod 'WCRetainCycleChecker', :configurations => ['Debug']

注意,在这里使用 :configurations => ['Debug'] 是告诉 cocoapods 不要在 Release 版本中集成 WCRetainCycleChecker,以去除生产环境中无用的代码。

执行 pod install 后,WCRetainCycleChecker 会在你的项目中自动生效,无需额外配置。

方法调用

  • WCRetainCycleChecker.setCheckDelay 设定检查延时
  • WCRetainCycleChecker.shouldDefaultWarning 是否显示默认警告信息
  • WCRetainCycleChecker.retainCycleFound 发现可能的循环引用时执行的回调,结合 FBRetainCycleDetector 使用更佳

demo:

1
2
3
4
5
6
7
8
9
10
11
12
#import <WCRetainCycleChecker/WCRetainCycleChecker.h>
...
#if DEBUG
[WCRetainCycleChecker setCheckDelay:2];
[WCRetainCycleChecker shouldDefaultWarning:NO];
[WCRetainCycleChecker retainCycleFound:^(UIViewController *viewController) {
NSLog(@"⁉️");
NSLog(@"%@", viewController);
}];
#endif

杂谈

刚刚把这个公开出来,就有朋友告知存在一个更为强大的 repo:MLeaksFinder😅