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
相关产品推荐
相关产品推荐

