SwiftUI中@State对象被不必要地创建与销毁问题
Observation宏下@State模型反复创建销毁问题
在Xcode 15.0、最低部署版本iOS 17环境中,使用Observation框架的@Observable宏标记类时,若SwiftUI子视图通过@State持有该类实例,父视图状态变化会导致子视图的@State模型被反复创建和销毁,即使子视图本身未发生任何变更。
重现代码
import SwiftUI import Observation struct ContentView: View { @State var showView = false var body: some View { VStack { PersonView() Button("show view") { showView.toggle() } if showView { Text("new view") } } } } @Observable class Person { var name: String init(name: String) { self.name = name print("model create \(self.name)") } deinit { print("model deinit \(self.name)") } } struct PersonView: View { @State private var model = Person(name: "swift") var body: some View { Text(model.name) } }
预期与实际行为
- 预期:持续点击按钮后,控制台仅输出一次
model create swift - 实际:控制台反复输出模型创建与销毁日志:
model create swift model create swift model create swift model deinit swift model create swift model deinit swift ...
解决方案
这是Xcode 15.0的已知bug,苹果在Xcode 15.1及后续版本中已修复该问题。若暂时无法升级Xcode,可采用以下临时方案:
方案1:为子视图添加固定ID
通过为PersonView设置固定ID,让SwiftUI识别其为同一视图实例,避免重复重建:
// 在ContentView的VStack中修改PersonView的调用 PersonView().id("fixed-person-view")
方案2:临时替换@State为@StateObject
将PersonView中的@State替换为@StateObject,虽不符合Observation框架的推荐用法,但可临时规避该bug:
struct PersonView: View { @StateObject private var model = Person(name: "swift") var body: some View { Text(model.name) } }
内容的提问来源于stack exchange,提问作者km3h
相关产品推荐
相关产品推荐

