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
我有一个包含 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