使用[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,提问作者Антон Разгуляев
相关产品推荐
相关产品推荐

