SwiftUI - 可能的内存泄漏

Waf*_*eow 9 user-interface memory-leaks swift swiftui

我最近开始研究 SwiftUI 并浏览了一些推荐基于状态交换视图的教程(请参阅下面的代码段)。但是,我在调试时注意到,即使是最基本的 UI,内存使用量也会慢慢增加。这可能只是缺乏知识,但是以这种方式与 SwiftUI 交换视图是错误的吗?

Version 11.0 (11A420a) - iOS 13

// Memory Leak Test
struct ContentView: View {
    @State private var toggle = false

    func cycleViews() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.toggle = !self.toggle
            self.cycleViews()
        }
    }

    var body: some View {
        Group {
            if toggle {
                ViewA()
            } else {
                ViewB()
            }
        }.onAppear {
            self.cycleViews()
        }
    }
}

struct ViewA: View {
    var body: some View {
        VStack {
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
        }
    }
}

struct ViewB: View {
    var body: some View {
        List {
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_* M. 5

您的代码似乎是完全可以接受的 SwiftUI,并且确实在某个地方存在内存泄漏,因为来回切换(即使使用手册而Toggle()不是asyncAfter()调用)会导致内存增加。

我相信这是列表的一个错误,因为如果您将列表更改为另一种类型的视图,问题就会消失,并且在将相同的模式与所有其他类型的视图一起使用时我没有注意到它。

我建议您向 Apple 提交反馈,并在此处发布反馈编号,以便其他受影响的人可以提交自己的反馈并参考。

  • 谢谢约翰。我测试了更多组件,并使用相同的示例发现了 List、ScrollView、Form 和 NavigationViews 的问题。参考号:FB7318839 (4认同)