SwiftUI中的@StateObject、@ObservedO
2024-02-05 本文已影响0人
喔牛慢慢爬
在 SwiftUI 中,@StateObject, @ObservedObject, 和 @State 都是用来管理视图状态的属性包装器,但它们的应用场景和行为有所不同:
- @State:
用于存储本地视图状态,如布尔值、字符串、数值等。
当 @State 属性的值发生变化时,SwiftUI 会自动触发关联视图的重新渲染。
@State 的生命周期与关联视图相同,当视图被销毁时,其内部存储的状态也会随之释放。
- @ObservedObject:
适用于观察一个遵循 ObservableObject 协议的对象,这个对象通常用来封装需要跨多个视图共享或从外部获取的数据源(例如网络请求结果、数据库模型等)。
当该对象内部通过 @Published 标注的属性发生改变时,所有引用了此对象的视图都会收到通知并重新渲染。
@ObservedObject 的生命周期并不绑定于任何一个特定的视图,它可能由父视图传入或者在其他地方创建,这意味着即使当前视图被销毁,该对象也可能继续存在。在不需要该对象时,需要手动管理其生命周期以避免内存泄漏。
- @StateObject (自 iOS 14 引入):
类似于 @ObservedObject,也是用于观察一个遵循 ObservableObject 协议的对象,但它确保在整个视图树中只有一个实例,并且随着包含它的视图重建而保留其状态。
当视图及其关联的 @StateObject 被移除后,系统会自动释放对象以避免内存泄漏。
在大多数情况下,如果视图需要拥有并管理一个需要保持唯一性的响应式对象,应该使用 @StateObject,而不是 @ObservedObject。
- 总结来说:
- @State 用于管理简单的局部视图状态。
- @ObservedObject 用于跨视图共享和观察响应式数据模型,但不保证对象的生命周期与视图同步。
- @StateObject 同样用于观察响应式数据模型,但提供了一种方式来确保对象在整个视图树中的唯一性,并且会随视图重建而保留状态,同时在适当的时候自动释放资源。