循环引用导致的内存泄漏问题是 iOS 开发者最经常碰到的性能问题之一,通常我们可以使用苹果官方的性能检测工具 Instruments - Leaks
帮助我们排查和定位。
最原始的方式可能是在 VC
的 dealloc
方法中输出打印页面已经被释放的日志。
deinit {
print("deinit \(self)")
}
社区中也有开发者提供了便利的第三方工具,如微信读书出品的较为广为人知的 MLeaksFinder,通过在 VC 被 pop 或 dismiss 时检测其自身及其子视图是否正确释放来实现,再比如 PLeakSniffer 在 VC 释放后利用心跳机制来推测子视图是否被正常释放。
这里介绍一个简单使用符号断点的方式来辅助检测 VC 是否被释放。这个方式无侵入性,也不需要编写任何代码,但局限性在于只能在跑工程的使用。
- 找到
Breakpoint Navigator
。(Menu View > Navigators > Show Breakpoint Navigator or ⌘ - command + 8)
Breakpoint Navigator
- 点击
+
号,选择符号断点Symbolic Breakpoint...
,或者选择Menu Debug > Breakpoints > Create Symbolic Breakpoint...
New Symbolic Breakpoint
- 设置
Symbol
为-[UIViewController dealloc]
Symbol
- 点击
Add Action
按钮,设置一个Sound Action
,声音可以自由选择
Sound
- 点击
Sound
后面+
增加另外一个Action
,设置Action
为Log Message
,设置在控制器释放后打印一条日志信息,这里设置--- dealloc @(id)[$arg1 description]@
。
Log Message
- 勾选
Automatically continue after evaluating actions
,在控制器释放后,允许程序不中断继续执行。
Automatically continue
- 通过这个断点,在控制器
dismisses
或者pops
时会播放一段声音,并打一段日志。
Symbolic Breakpoint
参考 Easy way to detect a retain cycle in a view controller