SwiftUI查看内存生命周期

时间:2020-02-04 09:56:00

标签: ios swift xcode swiftui combine

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

@ObservedObject var viewModel = ViewModel()

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

在这种情况下,使ViewModel为单例类可以解决此问题,但是使所有ViewModels单例类不是一个好主意。

是否有解决方法?

3 个答案:

答案 0 :(得分:2)

由于其他原因,制作ObservedObject单身并不是一个好主意。由于要预览视图,因此必须以某种方式注入视图模型,以使其在更复杂的情况下变得更容易。

只要我需要在SwiftUI中使用单例,我都会考虑使用从EnvironmentObject(在实际应用中)或从SceneDelegate添加的PreviewProvider预习。如果您将引用存储在SceneDelegate中,它将不会重新创建。

关于内存泄漏的问题,如果视图模型中没有保留周期,则不应泄漏。它将由ARC清除。

答案 1 :(得分:1)

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

此处提供更多信息:https://developer.apple.com/documentation/swiftui/stateobject

答案 2 :(得分:0)

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