类中 Color 类型的 SwiftUI 属性存在内存泄漏

问题描述 投票:0回答:1

我在 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),也会出现内存泄漏。

有谁知道如何解决这个问题还是苹果的错误?

swift xcode swiftui colors memory-leaks
1个回答
0
投票

View 结构不应该初始化类对象,因为它们没有生命周期,因此 var paramClass 会立即泄漏(顺便说一句,你应该使用 let 作为参数,因为 View 结构是不可变的)。您可以将 StateObject 用于类,但当它只是数据而不进行异步加载/保存时,带有结构的 State 是最好的。现在你可以使用 .task 进行异步加载,所以不再需要 stateobject 了。

© www.soinside.com 2019 - 2024. All rights reserved.