@ObservedObject
和 @StateObject
都是 SwiftUI 中用于处理视图和模型之间数据流的属性包装器,但它们有一些关键的区别。
@ObservedObject
-
用途:用于在视图中观察和响应遵循
ObservableObject
协议的对象的状态变化。 -
生命周期:
@ObservedObject
关联的对象通常是由视图外部创建和管理的,视图只是观察它的变化。因此,对象的生命周期可能超出视图的生命周期。 -
更新方式:当被观察对象的
@Published
属性发生变化时,视图会自动更新以反映新的状态。 -
示例:
class MyModel: ObservableObject { @Published var someValue = 0 } struct MyView: View { @ObservedObject var model = MyModel() var body: some View { Text("Value: \(model.someValue)") } }
@StateObject
-
用途:用于在视图中创建和管理一个遵循
ObservableObject
协议的对象,并确保该对象的生命周期与视图的生命周期相关联。 -
生命周期:
@StateObject
会在视图被创建时初始化,并在视图被销毁时一同销毁。这意味着对象的生命周期与视图的生命周期是一致的。 -
更新方式:与
@ObservedObject
类似,当@StateObject
的@Published
属性发生变化时,视图也会自动更新。 -
示例:
class MyModel: ObservableObject { @Published var someValue = 0 } struct MyView: View { @StateObject private var model = MyModel() var body: some View { Text("Value: \(model.someValue)") .onTapGesture { model.someValue += 1 } } }
关键区别
-
生命周期管理:
@ObservedObject
通常用于外部创建的对象,其生命周期可能超出视图;而@StateObject
是由视图创建和管理的,其生命周期与视图一致。 -
所有权:使用
@ObservedObject
时,视图不拥有对象的所有权;而使用@StateObject
时,视图拥有并管理对象的生命周期。 -
初始化:
@StateObject
允许你在视图初始化时设置对象的初始状态,而@ObservedObject
通常是在视图外部已经初始化好的对象。
选择使用哪个属性包装器取决于你的具体需求,比如对象的所有权、生命周期管理以及初始化方式等。在大多数情况下,如果你需要在视图内部创建和管理一个模型对象,并且希望该对象的生命周期与视图一致,那么 @StateObject
是更合适的选择。如果你有一个外部创建的模型对象,并且只是希望在视图中观察它的状态变化,那么 @ObservedObject
是更好的选择。