swift 视图解除期间未取消初始化视图模型可观察对象

pvcm50d1  于 2023-09-29  发布在  Swift
关注(0)|答案(1)|浏览(118)

当fullScreenCover闭包被触发并通过PresentedView()传递时,我正在创建一个视图模型。当模态视图被解除时,视图模型永远不会被反初始化。当我再次切换视图时,将创建视图模型的另一个示例。为什么当视图的生命周期结束时,swift没有取消可观察对象的初始化?

struct ContentView: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button("Present!") {
            isPresented.toggle()
        }
        
        .fullScreenCover(isPresented: $isPresented) {
            let vm = ViewModel()
            PresentedView(vm: vm)
        }
    }
}

struct PresentedView: View {
    @Environment(\.dismiss) var dismiss
    @ObservedObject var vm: ViewModel
    
    init(vm: ViewModel) {
        self.vm = vm
    }
    
    var body: some View {
        Text("Presented View").onTapGesture {
            dismiss()
        }
    }
}

class ViewModel: ObservableObject {
    init() {
        print("Init")
    }
    
    deinit {
        print("deinit")
    }
}
wfveoks0

wfveoks01#

首先,你需要理解同一个视图类的多个对象是为SwiftUI示例化的,用于手机上的同一个视图。因此,与UIKit不同,视图类的每个对象实际上并不包含观察到的对象示例。因此,每个视图示例的每个deinit都不会调用观察对象的deinit。我不知道他们什么时候会为观察对象清除内存,但你不应该使用deinit。只需使用ondisaapear调用观察对象清除方法

相关问题