iOS 开发中,最常用的便是 UIViewController 了,也是 MVC 的重要组成部分。可是视图控制器也是常常发生内存走漏的组件之一,因为它的结构往往很复杂,常常要持有各式各样的目标,又被多个目标同时持有。稍有不小心就会导致循环引用,终究导致内存走漏。

今日咱们就来讲讲几种检测控制器内存走漏的办法。

办法一

直接在控制器毁掉的机遇打印一条日志:

deinit {
    print("\(self) 正常毁掉~")
}

这是最简略的一种方法,假如这个控制器存在内存走漏, deinit 办法将不会被调用,进而不会打印任何内容。

你能够在页面退出的时分观察控制台有没有打印这条 log 来判别是否正常毁掉

办法二

运用断点在毁掉机遇自动播放声响,与上边的办法类似,可是这个办法运用的是全局断点。

点击导航栏上的的断点按钮(快捷键 command + 8),点击左下角的加号,然后选择 Symbolic Breakpoint...

如何检测控制器循环引用

接下来填写断点的配置:

Name : 断点的名称,能够不填

Symbol 设置为值 -[UIViewController dealloc],标明触发机遇是 UIViewController 在调用 dealloc 办法的时分。

Module 履行的模块名,能够不填

然后点击 Add Action 按钮,这儿能够选择一个触发断点后的操作,比方咱们选择 Sound,意思是当触发断点时播放一个声响,后边的选项能够选择不同的声响

如何检测控制器循环引用

最后需求勾选 Options,Automatically continue after evaluating actions,意思是当触发断点时是停在这儿还是持续履行代码,咱们这儿勾选这个选项,触发之后持续履行代码。

如何检测控制器循环引用

这时整个断点就设置好了,当有控制器毁掉时(调用了 dealloc),电脑就会发出一个声响,这样咱们就能够在页面关闭时留意有没有这个声响播放来判别是否有内存走漏。

办法三

运用第三方东西,有一些第三方东西运用运转时对 UIViewController 生命周期办法进行监控等方法来检测是否存在内存走漏。

比方之前腾讯比较闻名的 MLeaksFinder,可是这个库已经好久不维护了,我找到了别的一个开源库叫做 AMLeaksFinder,它也是运用了类似的原理。

只需求咱们运用 CocoaPods 导入这个库

pod 'AMLeaksFinder', '2.2.4',  :configurations => ['Debug']

然后运转项目后,会在屏幕上展示一个 View 控件,显现控制器的状况,假如有走漏,就会展示出来。

如何检测控制器循环引用

我并没有深入研究和运用这个库,我们感兴趣能够自己运用一下看看。

参考资料

[1]

AMLeaksFinder: github.com/liangdahong…

点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识

本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!