我在 IOS 17 中使用 SwiftUI 的类中声明的 Color 类型的属性存在内存泄漏问题。
我正在使用它的项目比下面的示例完整得多。
下面的项目只是一个内存泄漏的例子。
我有3个文件。
第一个是我的课。
第二个是主视图。
第三个是显示和修改颜色的子视图。
参数类
import SwiftUI
@Observable
class ParamClasse{
var couleurTexte:Color = .green
init(couleurTexte: Color) {
self.couleurTexte = couleurTexte
}
}
主视图文件
import SwiftUI
struct MainView: View {
var paramClass:ParamClasse = ParamClasse(couleurTexte: .blue)
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
.foregroundStyle(paramClass.couleurTexte)
ModifierCouleurClassView(paramClasse: paramClass)
}
.padding()
}
}
#Preview {
MainView()
}
修改器CouleurClassView
import SwiftUI
struct ModifierCouleurClassView: View {
@Bindable var paramClasse:ParamClasse
var body: some View {
ColorPicker("Modifier couleur texte", selection: $paramClasse.couleurTexte)
}
}
#Preview {
ModifierCouleurClassView(paramClasse: ParamClasse(couleurTexte: .red))
}
如果我用结构替换类,内存泄漏仍然存在。
如果我使用旧的方法(ObservableObject 和 @ObservedObject),也会出现内存泄漏。
有谁知道如何解决这个问题还是苹果的错误?
View 结构不应该初始化类对象,因为它们没有生命周期,因此 var paramClass 会立即泄漏(顺便说一句,你应该使用 let 作为参数,因为 View 结构是不可变的)。您可以将 StateObject 用于类,但当它只是数据而不进行异步加载/保存时,带有结构的 State 是最好的。现在你可以使用 .task 进行异步加载,所以不再需要 stateobject 了。