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

使用[weak self]无效?我的Swift代码哪里出错了?

关于[weak self]无法终止后台无用计算的疑问

我创建了一个用于测试[weak self]的项目,包含以下内容:

  • 主文件
  • 作为首页视图、仅负责导航到ContentView的MenuView
  • 展示高负载计算结果的ContentView
  • 包含高负载计算逻辑(1亿次循环向数组追加元素)的ViewModel

我在代码中使用了[weak self],当用户关闭ContentView时ViewModel会被销毁,但查看CPU图表发现,即使该实例已销毁,计算仍会执行完毕,且使用[weak self]与不使用的CPU图表完全无差异。

以下是完整代码:

struct ContentView: View {
    @StateObject var vm = ViewModel()

    var body: some View {
        VStack {
            Text("App started")
            Text(vm.helloData.count.description)
        }
        .padding()
    }
}

class ViewModel: ObservableObject {
    @Published var helloData: [String] = []

    init() {
        print("ViewModel инициализирован")
        
        let count = UserDefaults.standard.integer(forKey: "count")
        UserDefaults.standard.set(count+1, forKey: "count")


        var data: [String] = []
        DispatchQueue.global().async { [weak self] in
            for _ in (0..<100_000_000) {
                data.append("Hello, world!")
            }
            DispatchQueue.main.sync {
                self?.helloData = data
            }
        }
    }

    deinit {
        print("ViewModel деинициализирован")

        let count = UserDefaults.standard.integer(forKey: "count")
        UserDefaults.standard.set(count-1, forKey: "count")
    }
}

struct MenuView: View {
    @AppStorage ("count") var count: Int = 0

    init() {
        self.count = 0
    }

    var body: some View {
        NavigationStack{
            NavigationLink("go to ContentView", destination: ContentView())
        }
        .overlay {
            VStack {
                Text(count.description)
                    .font(.title)
                Spacer()
            }
        }
    }
}

我原本以为[weak self]的作用是终止这类无用计算,但实际未达到预期,请问我哪里出错了?


内容的提问来源于stack exchange,提问作者Антон Разгуляев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:18:20