SwiftUI 查看内存生命周期

SwiftUI View memory lifecycle

我有一个包含 ViewModel 的主视图,它是这样声明的

@ObservedObject var viewModel = ViewModel()

一切正常,但是当我将应用程序移至后台,然后移至前台时,View 会重新创建自身以及我的 viewModel,并且 viewModel 中存储的所有内容都会消失。

在这种情况下,将 ViewModel 设为单例 class 将解决问题,但将所有 ViewModel 设为单例 class 并不是一个好主意。

有解决办法吗?

由于其他原因,制作 ObservedObject 单例不是一个好主意。因为你想预览你的视图,你必须以某种方式注入你的视图模型,以便在更复杂的情况下更容易。

每当我需要在 SwiftUI 中使用单例时,我都会考虑使用从 SceneDelegate(在实际应用程序中)或从 PreviewProvider 添加的 EnvironmentObject,以防万一的预览。如果您将引用存储在 SceneDelegate 中,它将不会重新创建。

关于内存泄漏问题,如果视图模型中没有保留循环,则不应泄漏。它会被 ARC 清除。

对于应该共享的数据,SwiftUI 给了我们 @EnvironmentObject

如果您正在为 iOS 14 构建,请查看@StateObject。 SwiftUI 只为每个声明它的容器创建一次@StateObject,并将其保存在视图生命周期之外。这意味着视图拥有值,并且值的生命周期与视图的生命周期相关,而不是结构。

这里有更多信息:https://developer.apple.com/documentation/swiftui/stateobject