微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有动态生成视图的 NavigationView/List/ForEach 中的泄漏

如何解决具有动态生成视图的 NavigationView/List/ForEach 中的泄漏

如果您在 SwiftUI 代码中创建了一个显示大量泄漏对象的非常简单的示例,如果您在 NavigationView/List/ForEach 闭包中嵌套 ForEach 并返回不同类型的视图。

import SwiftUI

class MyStateObject : ObservableObject {
    
    @Published var items:[Int]
    
    init() {
        self.items = Array(0..<1000)
    }
    
}

struct ContentView: View {
    
    @StateObject var stateObject = MyStateObject()
    
    var body: some View {
        NavigationView {
            List {
                ForEach(stateObject.items,id: \.self) { item in
                    
                    if(item % 2 == 0) {
                        Text("Even \(item)")
                    }
                    else {
                        Image(systemName: "xmark.octagon")
                    }
                    
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我强烈怀疑这是 SwiftUI 中的一个错误,但我想问问我是否在这里做错了什么

您可以通过连接 Instruments 来查看泄漏。如果您滚动列表,它会立即显示增加

有趣的是,如果

  • 您从层次结构中删除 NavigationView
  • 您只在 View 中提供一种类型的 ForEach(并且不要通过 if/else 进行分支)。
  • 您要显示的项目列表很小(100 似乎不会导致泄漏)。

(在 XCode 12.5 和 iOS 14.5 模拟器和设备上测试)

由于在我的应用中我非常依赖这种层次结构,因此我非常愿意就如何避免泄漏提出一些建议。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。