为什么不在 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 的唯一方法是当 structContentView 的所有副本超出范围时。