如何排查UIDeviceWhiteColor中的内存泄漏问题
追踪UIDeviceWhiteColor内存泄漏的实操步骤
一、用Instruments Leaks工具定位泄漏根源
- 打开Xcode,通过
Product > Profile(快捷键Cmd+I)启动性能分析,选择Leaks模板。 - 启动App后,重复操作会触发泄漏的场景(比如反复进出目标页面),等Leaks面板出现红色泄漏标记,在左侧列表找到
UIDeviceWhiteColor条目。 - 选中该条目,切换到右侧Call Tree标签,勾选
Hide System Libraries和Invert Call Tree,过滤后就能直接看到你代码中触发颜色创建的调用路径,定位到具体代码行。
二、用Allocations工具追踪分配全链路
如果Leaks的调用栈信息不够清晰,换用Allocations工具深挖:
- 同样通过
Product > Profile打开,选择Allocations模板。 - 启动App后点击左上角
Record开始记录,操作完泄漏场景后停止记录。 - 在搜索框输入
UIDeviceWhiteColor,找到所有该类实例,右键选择Show in Call Tree,勾选系统库过滤选项,查看这些实例在你代码中的创建源头。
三、解决断点无效的问题
你添加的含“white”的断点没效果,是因为UIDeviceWhiteColor是系统底层创建的(比如调用UIColor.white时,系统可能从缓存取或通过私有方法创建,不会触发你预期的公开方法断点)。试试这些替代方案:
- 给
UIColor的colorWithWhite:alpha:加符号断点:在Xcode断点导航栏点+,选Symbolic Breakpoint,输入-[UIColor colorWithWhite:alpha:],这样能捕获所有通过该方法创建的白色实例。 - 直接给
UIDeviceWhiteColor的初始化方法加断点:符号填-[UIDeviceWhiteColor initWithWhite:alpha:],拦截系统层面的实例创建。
四、排查常见泄漏场景
- 检查是否把白色实例存在了全局变量、单例的强属性里,导致对象无法被释放。
- 排查闭包是否强引用了持有颜色对象的实例,形成循环引用(比如闭包捕获
self,而self又持有该颜色)。 - 检查是否在循环里重复创建白色实例却没复用(比如每次循环都
[[UIColor alloc] initWithWhite:1 alpha:1],而非复用全局的UIColor.white)。
内容的提问来源于stack exchange,提问作者Paul S.
相关产品推荐
相关产品推荐

