为什么不在 ObservableObject 子类上调用 deinit?
Why deinit is not being called on ObservableObject subclass?
我有这个简单的示例应用程序。为什么在显示下一个屏幕后未在 Observable 对象视图模型上调用析构器?
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView(contentViewModel: ContentViewModel())
}
}
}
class ContentViewModel: ObservableObject {
deinit {
print("deinit")
}
}
struct ContentView: View {
@ObservedObject var contentViewModel: ContentViewModel
@State var toPresentNext: Bool = false
var body: some View {
Text("Hello, world!")
.padding()
.onTapGesture {
toPresentNext = true
}.fullScreenCover(isPresented: $toPresentNext) {
ContentView1()
}
}
}
struct
是值类型,而 class
是引用类型(请参阅 Is Swift Pass By Value or Pass By Reference 了解这意味着什么)。
所以基本上你不会引用 ContentView
对象,它的对象不会被传递。它宁愿复制自己。因此,调用 deinit
的唯一方法是当 struct
或 ContentView
的所有副本超出范围时。
我有这个简单的示例应用程序。为什么在显示下一个屏幕后未在 Observable 对象视图模型上调用析构器?
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView(contentViewModel: ContentViewModel())
}
}
}
class ContentViewModel: ObservableObject {
deinit {
print("deinit")
}
}
struct ContentView: View {
@ObservedObject var contentViewModel: ContentViewModel
@State var toPresentNext: Bool = false
var body: some View {
Text("Hello, world!")
.padding()
.onTapGesture {
toPresentNext = true
}.fullScreenCover(isPresented: $toPresentNext) {
ContentView1()
}
}
}
struct
是值类型,而 class
是引用类型(请参阅 Is Swift Pass By Value or Pass By Reference 了解这意味着什么)。
所以基本上你不会引用 ContentView
对象,它的对象不会被传递。它宁愿复制自己。因此,调用 deinit
的唯一方法是当 struct
或 ContentView
的所有副本超出范围时。