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

SwiftUI中TabView关联@Published属性致内存泄漏排查求助

SwiftUI内存泄漏排查:@Published变量的引用链追踪问题

在代码审查排查内存泄漏时,定位到一处无法完全理解的泄漏问题——通过隔离代码复现后,调试内存图显示问题源于@Published var currentPage。

补充说明:1. 以下代码为简化版本,仅用于复现问题;2. 本文核心目标是理解泄漏原因,而非寻找特定解决方案。

泄漏复现步骤

  • 将TheProblematicView作为根视图嵌入UIHostingController
  • 通过UINavigationController推送该视图
  • 点击导航栏返回按钮弹出视图,此时确认无其他外部对象持有该视图(已测试其他同结构视图可正常释放)

复现代码

import SwiftUI

@MainActor
class TheProblematicViewModel: ObservableObject {

    // 疑似泄漏源
    @Published var currentPage = 0

    var slides: [TutorialSlide] = [ .init() ]
}

struct TutorialSlide {}


struct TheProblematicView: View {

    @StateObject var viewModel = TheProblematicViewModel()

    var body: some View {
        PagerView(
            tabItems: viewModel.slides,
            currentPage: $viewModel.currentPage
        )
    }
}

struct PagerView: View {

    var tabItems: [TutorialSlide]

    @Binding var currentPage: Int

    var body: some View {
        TabView(selection: $currentPage) {
            ForEach(tabItems.indices, id: \.self) { index in

                PageView(slide: tabItems[index])
                    .tag(index)
            }
        }
    }
}

struct PageView: View {

    var slide: TutorialSlide

    var body: some View { EmptyView() }
}

内存图追踪疑问

从内存图中可以看到代表强引用的粗线,但追踪到ObservableObjectPublisher后,后续的引用链就无法继续追踪了——原本预期能在Publisher的引用路径中找到ViewModel的强引用来源,却只看到模糊的元数据类内容。由于对内存图的使用经验不足,请问如何操作才能从内存图中获取更多有效信息?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:21:09