SwiftUI 查看内存生命周期
Posted
技术标签:
【中文标题】SwiftUI 查看内存生命周期【英文标题】:SwiftUI View memory lifecycle 【发布时间】:2020-02-04 09:56:00 【问题描述】:我有一个有 ViewModel 的主视图,它是这样声明的
@ObservedObject var viewModel = ViewModel()
一切正常,但是当我将应用程序移至后台然后移至前台时,视图会重新创建自身以及我的 viewModel,并且存储在 viewModel 中的所有内容都会消失。
在这种情况下,将 ViewModel 设为单例类将解决问题,但将所有 ViewModel 设为单例类并不是一个好主意。
有解决办法吗?
【问题讨论】:
【参考方案1】:由于其他原因,创建 ObservedObject
单例并不是一个好主意。由于您想预览您的视图,您必须以某种方式注入您的视图模型,以使其更容易处理更复杂的情况。
每当我需要SwiftUI
中的单例时,我会考虑使用从SceneDelegate
(在实际应用程序中)添加的EnvironmentObject
,或者从PreviewProvider
添加以进行预览。如果您将引用存储在您的 SceneDelegate
中,它将不会重新创建。
关于内存泄漏问题,如果视图模型中没有保留周期,则它不应该泄漏。它会被 ARC 清理掉。
【讨论】:
【参考方案2】:如果您正在为 ios 14 构建,请查看 @StateObject。 SwiftUI 只为每个声明它的容器创建一次@StateObject,并将其保持在视图生命周期之外。这意味着视图拥有值,并且值的生命周期与视图的生命周期相关联,而不是结构。
更多信息在这里:https://developer.apple.com/documentation/swiftui/stateobject
【讨论】:
【参考方案3】:对于应该共享的数据,SwiftUI 给了我们@EnvironmentObject
【讨论】:
以上是关于SwiftUI 查看内存生命周期的主要内容,如果未能解决你的问题,请参考以下文章
如何为不同环境的 SwiftUI App 生命周期应用程序运行 UI 测试?
如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?