Swift 5使用Instruments检测内存泄漏时模拟器白屏求助
我之前在Xcode 11.x版本也碰到过类似的情况,模拟器白屏导致没法用Instruments查循环引用,给你分享几个我当时排查和解决的思路:
先排查模拟器本身的异常
先试试最基础的重置操作:重启模拟器(通过菜单Hardware > Restart),或者直接重置模拟器的所有内容和设置(Hardware > Erase All Content and Settings)。模拟器的缓存文件有时候会堆积导致启动异常,重置后大概率能解决部分场景的白屏问题。另外可以换个不同型号的模拟器设备试试,比如从iPhone 11切换到iPhone SE(第二代),不同设备的运行环境可能存在兼容性差异。验证Xcode与Instruments的运行状态
有时候Xcode或Instruments的进程会出现冲突,导致启动异常。建议先完全退出Xcode和Instruments,甚至重启电脑后再尝试。另外要确认项目的Deployment Target和模拟器的系统版本匹配,比如项目target设置为iOS 13.0,就尽量选择对应iOS 13版本的模拟器,跨版本的兼容问题也可能引发白屏。先确认项目本身能正常启动
先脱离Instruments,直接用Xcode的Run按钮启动项目到模拟器。如果项目本身启动就白屏,那得先解决项目的启动问题:- 查看Xcode控制台的输出,有没有启动时的崩溃日志或者报错信息;
- 检查
AppDelegate或SceneDelegate的启动逻辑,有没有阻塞主线程的同步操作(比如同步网络请求); - 排查启动阶段的初始化代码,有没有未捕获的异常。
换一种Instruments的启动方式
不要直接从Xcode点击Profile按钮启动Instruments,试试这个流程:- 用Xcode正常启动项目到模拟器,确保App能正常运行;
- 打开Instruments,选择
Leaks模板; - 在Instruments的目标选择器里,手动attach到正在运行的App进程。
这种方式能绕过启动时的一些注入异常,有时候就能正常检测了。
检查项目的Build Settings配置
查看项目的编译设置,重点关注这几个选项:Build Active Architecture Only:Debug模式下建议设为YES,如果设为NO可能会编译出不兼容模拟器的架构,导致启动异常;- 排查有没有自定义的编译脚本或者第三方混淆工具,这类工具可能会干扰Instruments的代码注入,暂时关闭后再尝试。
临时用替代方案排查循环引用
如果Instruments暂时没法用,可以先用Xcode自带的Debug Memory Graph功能:
在Debug模式下运行项目,点击Debug导航栏里的内存图按钮(看起来像三个重叠的圆圈),就能查看所有存活对象的引用关系,直接定位循环引用的节点。另外也可以手动排查常见的循环引用场景:- Block中是否正确使用了
weak self+strong self避免强引用; - 代理属性是否用
weak修饰(而不是strong); NSTimer是否存在持有target的情况,记得在合适的时机 invalidate;- 通知的移除是否及时,避免观察者被意外持有。
- Block中是否正确使用了
内容的提问来源于stack exchange,提问作者ssowri1

