我想在向后导航后尽快取消@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")
}
}
3条答案
按热度按时间vh0rcniy1#
对于所有阻止@StateObject取消初始化的情况,我没有一个很好的答案,但是我发现让后台异步任务运行可以阻止取消初始化。
在我的例子中,我注册了几个cancellable来监听PassthroughSubject和/或CurrentValueSubject(我用它们来处理模型的外部变化,并将结果暴露给视图),但我从未取消过它们。
因此,我的视图都使用.onAppear“订阅”视图模型(我有一个viewModel.subscribe()方法),然后使用. onDisappear“取消订阅”视图模型(我有一个viewModel.subscribe()方法)。
1tuwyuhd2#
在GregP的回答中补充道:如果您已经删除了
onDisappear
上的所有cancellables
,并且deinit
仍未被调用,则可以使用调试内存图导航到对象,查看它的树,看看还有什么在引用它。例如,我让它看起来像这样:
因为有另一个对象引用了这个对象,所以它没有从内存(ARC)中删除,所以我所要做的就是删除它作为委托沿着取消调用
cancellables
和deinit
qcuzuvrc3#
我认为应该使用
@ObservedObject private var viewModel: ViewModel
,然后从TestView外部注入新的ViewModel示例