@ObservedObject
和 @StateObject
都是 SwiftUI 中用于處理視圖和模型之間數(shù)據(jù)流的屬性包裝器贸呢,但它們有一些關(guān)鍵的區(qū)別伸刃。
@ObservedObject
-
用途:用于在視圖中觀察和響應(yīng)遵循
ObservableObject
協(xié)議的對象的狀態(tài)變化。 -
生命周期:
@ObservedObject
關(guān)聯(lián)的對象通常是由視圖外部創(chuàng)建和管理的樟插,視圖只是觀察它的變化韵洋。因此,對象的生命周期可能超出視圖的生命周期黄锤。 -
更新方式:當(dāng)被觀察對象的
@Published
屬性發(fā)生變化時搪缨,視圖會自動更新以反映新的狀態(tài)。 -
示例:
class MyModel: ObservableObject { @Published var someValue = 0 } struct MyView: View { @ObservedObject var model = MyModel() var body: some View { Text("Value: \(model.someValue)") } }
@StateObject
-
用途:用于在視圖中創(chuàng)建和管理一個遵循
ObservableObject
協(xié)議的對象鸵熟,并確保該對象的生命周期與視圖的生命周期相關(guān)聯(lián)副编。 -
生命周期:
@StateObject
會在視圖被創(chuàng)建時初始化,并在視圖被銷毀時一同銷毀流强。這意味著對象的生命周期與視圖的生命周期是一致的痹届。 -
更新方式:與
@ObservedObject
類似,當(dāng)@StateObject
的@Published
屬性發(fā)生變化時打月,視圖也會自動更新队腐。 -
示例:
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 } } }
關(guān)鍵區(qū)別
-
生命周期管理:
@ObservedObject
通常用于外部創(chuàng)建的對象,其生命周期可能超出視圖奏篙;而@StateObject
是由視圖創(chuàng)建和管理的柴淘,其生命周期與視圖一致。 -
所有權(quán):使用
@ObservedObject
時秘通,視圖不擁有對象的所有權(quán)为严;而使用@StateObject
時,視圖擁有并管理對象的生命周期充易。 -
初始化:
@StateObject
允許你在視圖初始化時設(shè)置對象的初始狀態(tài)梗脾,而@ObservedObject
通常是在視圖外部已經(jīng)初始化好的對象。
選擇使用哪個屬性包裝器取決于你的具體需求盹靴,比如對象的所有權(quán)炸茧、生命周期管理以及初始化方式等。在大多數(shù)情況下稿静,如果你需要在視圖內(nèi)部創(chuàng)建和管理一個模型對象梭冠,并且希望該對象的生命周期與視圖一致,那么 @StateObject
是更合適的選擇改备。如果你有一個外部創(chuàng)建的模型對象控漠,并且只是希望在視圖中觀察它的狀態(tài)變化,那么 @ObservedObject
是更好的選擇。