You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:23:29