iOS 17 SwiftUI中Color类型属性引发内存泄漏问题求助
iOS 17 SwiftUI中Color属性引发的内存泄漏问题解决方法
问题场景
在iOS 17的SwiftUI环境中,使用@Observable类、结构体或旧的ObservableObject+@ObservedObject方案时,只要类/结构体中包含Color类型的属性,并通过ColorPicker绑定修改该属性,就会出现内存泄漏。复现示例包含三个核心文件:
ParamClasse:被@Observable修饰的类,包含couleurTexte: Color属性MainView:实例化ParamClasse并展示文本颜色,引入子视图ModifierCouleurClassView:通过ColorPicker修改ParamClasse的Color属性
解决方案
目前最有效的规避方法是用UIColor(iOS)/NSColor(macOS)替代SwiftUI的Color作为存储类型,在视图中再转换为SwiftUI的Color使用。这样可以绕过SwiftUI内部Color类型可能存在的强引用循环问题。
代码示例
// ParamClasse.swift import SwiftUI import UIKit @Observable class ParamClasse { // 改用UIColor存储颜色值 var couleurTexte: UIColor = .black } // MainView.swift struct MainView: View { let params = ParamClasse() var body: some View { VStack { Text("示例文本") // 转换为SwiftUI Color使用 .foregroundStyle(Color(params.couleurTexte)) ModifierCouleurClassView(params: params) } } } // ModifierCouleurClassView.swift struct ModifierCouleurClassView: View { let params: ParamClasse var body: some View { // ColorPicker直接支持绑定UIColor ColorPicker("选择文本颜色", selection: $params.couleurTexte) } }
原因分析
SwiftUI的Color类型在iOS 17的实现中,可能与视图环境存在隐式的强引用关联,当通过双向绑定(如ColorPicker的selection)连接到可观察对象时,会形成无法被ARC自动释放的引用循环。改用UIKit/AppKit的颜色类型后,由于其与SwiftUI视图环境的耦合更弱,不会触发该泄漏问题。
关于Apple Bug的判断
目前该问题在多种数据结构(类、结构体)和观察方案下均复现,大概率属于iOS 17 SwiftUI的框架Bug。建议通过Apple的Feedback Assistant提交复现项目和详细描述,帮助官方修复该问题。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

