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

Apple Instruments View Body无法记录SwiftUI Text视图调用,如何排查卡顿?

SwiftUI原生视图(如Text)的性能排查问题

测试场景与现象

我编写了一段测试代码,故意让SwiftUI一次性绘制数千个Text("Child")视图来制造卡顿——由于ChildView被包裹在VStack中,子ForEach内的视图会被即时全部创建:

import SwiftUI

struct ParentView: View {
    var body: some View {
        List {
            ForEach(0..<10) { parentIndex in
                VStack {
                    Text("Parent \(parentIndex + 1 )")
                    ChildView()
                }
            }
        }
        .padding()
    }
}

struct ChildView: View {
    var body: some View {
        ForEach(0..<1000) { childIndex in
            Text("Child")
                .frame(minHeight: 200)
        }
    }
}

对这段代码做性能分析时,卡顿现象符合预期。但在卡顿的检查范围内,Instruments的View Body工具输出显示:SwiftUI通道共有95次视图body调用,测试应用(NestedForEach)通道仅有8次——原生Text视图的调用并未被记录。

这是因为SwiftUI原生视图的body在编译时无法直接访问,导致View Body工具无法追踪到它的调用。

之后我将代码修改为用自定义TextView包裹原生Text:

import SwiftUI

struct ParentView: View {
    var body: some View {
        List {
            ForEach(0..<10) { parentIndex in
                VStack {
                    Text("Parent \(parentIndex + 1 )")
                    ChildView()
                }
            }
        }
        .padding()
    }
}

struct ChildView: View {
    var body: some View {
        ForEach(0..<1000) { childIndex in
            TextView()
                .frame(minHeight: 200)
        }
    }
}

struct TextView: View {
    var body: some View {
        Text("Child")
    }
}

使用自定义视图后,View Body工具显示测试应用通道中TextView的body被调用了5000次,终于能看到视图创建的次数。

寻求解决方案

我想知道:

  • 无需创建自定义视图,能否通过Instruments查看Text这类SwiftUI原生视图的调用?
  • 有没有其他方法可以排查此类卡顿问题?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:08:17