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

SwiftUI Sheet/FullScreenCover未释放传入对象内存问题咨询

SwiftUI sheet/fullScreenCover 内存泄漏问题(iOS 17.0-17.1)

发现一个异常现象:SwiftUI的sheet或fullScreenCover组件无法释放传入其item参数的对象。具体表现为:

  • 在iOS 16系统中,无论使用Xcode 14还是15构建,内存均能正常释放(模拟器、真机均验证);
  • 在iOS 17系统(含17.0.2真机、模拟器)中使用Xcode 15构建时,会出现内存泄漏,对象无法释放。

更新: 苹果已在iOS 17.2版本修复该Bug,仅iOS 17.0至17.1版本存在此内存泄漏问题。

复现代码

struct CoordinatorView: View {
    @State var sheetVM: SheetVM?
    
    var body: some View {
        Button {
            sheetVM = .init(dataGetter: {
                /// External injection needed here. This is just a simplified example
                try await Task.sleep(nanoseconds: 1_000_000_000)
                return "New title"
            })
        } label: {
            Text("Navigate")
        }
        .sheet(item: $sheetVM) { sheetVM in
            SheetView(viewModel: sheetVM)
        }
    }
}

final class SheetVM: ObservableObject, Identifiable {
    @Published var title: String = "Title"
    private let dataGetter: () async throws -> String
    
    init(dataGetter: @escaping () async throws -> String) {
        self.dataGetter = dataGetter
        print("SheetVM init")
        Task { [refresh] in
            await refresh()
        }
    }
    
    @MainActor
    @Sendable
    private func refresh() async {
        do {
            title = try await dataGetter()
        } catch {
            print("Failed to get data")
        }
    }
    
    deinit { print("... SheetVM deinit") }
}

struct SheetView: View {
    @ObservedObject var viewModel: SheetVM
    
    var body: some View {
        Text("\(viewModel.title)")
    }
}

struct SheetView_Previews: PreviewProvider {
    static var previews: some View {
        CoordinatorView()
    }
}

内容的提问来源于stack exchange,提问作者bodich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:02:05