当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")
}
}
1条答案
按热度按时间wfveoks01#
首先,你需要理解同一个视图类的多个对象是为SwiftUI示例化的,用于手机上的同一个视图。因此,与UIKit不同,视图类的每个对象实际上并不包含观察到的对象示例。因此,每个视图示例的每个deinit都不会调用观察对象的deinit。我不知道他们什么时候会为观察对象清除内存,但你不应该使用deinit。只需使用ondisaapear调用观察对象清除方法