SwiftUI -返回时如何定义状态对象?

hiz5n14c  于 2023-01-08  发布在  Swift
关注(0)|答案(3)|浏览(112)

我想在向后导航后尽快取消@StateObject的初始化,但对象似乎保留在内存中。“Deint ViewModel”在向后导航时没有打印,它是在我再次导航到我来自的视图后第一次打印的。有办法在向后导航时从内存中释放@StateObject吗?

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: TestView(), label: { Text("Show Test View") })
        }
    }
}

struct TestView: View {
    
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        Text("Test View")
    }
}

final class ViewModel: ObservableObject {
    deinit {
        print("Deint ViewModel")
    }
}
vh0rcniy

vh0rcniy1#

对于所有阻止@StateObject取消初始化的情况,我没有一个很好的答案,但是我发现让后台异步任务运行可以阻止取消初始化。
在我的例子中,我注册了几个cancellable来监听PassthroughSubject和/或CurrentValueSubject(我用它们来处理模型的外部变化,并将结果暴露给视图),但我从未取消过它们。
因此,我的视图都使用.onAppear“订阅”视图模型(我有一个viewModel.subscribe()方法),然后使用. onDisappear“取消订阅”视图模型(我有一个viewModel.subscribe()方法)。

1tuwyuhd

1tuwyuhd2#

在GregP的回答中补充道:如果您已经删除了onDisappear上的所有cancellables,并且deinit仍未被调用,则可以使用调试内存图

导航到对象,查看它的树,看看还有什么在引用它。例如,我让它看起来像这样:

因为有另一个对象引用了这个对象,所以它没有从内存(ARC)中删除,所以我所要做的就是删除它作为委托沿着取消调用cancellablesdeinit

qcuzuvrc

qcuzuvrc3#

我认为应该使用@ObservedObject private var viewModel: ViewModel,然后从TestView外部注入新的ViewModel示例

相关问题