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 生命周期不支持 CoreData

如何为不同环境的 SwiftUI App 生命周期应用程序运行 UI 测试?

如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?

如何在 SwiftUI 应用生命周期中更改状态栏样式?

如何将 CoreSpotlight 与 Swiftui 应用生命周期进行深度链接?

如何更改应用程序色调颜色(新的 SwiftUI 生命周期应用程序)?