SwiftUI-可能的内存泄漏

时间:2019-09-23 17:25:17

标签: swift user-interface memory-leaks 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")
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

我认为这是List的错误,因为如果将List更改为另一种视图类型,该问题将消失,并且当在所有其他类型的视图中使用相同模式时,我没有注意到它。

我建议您file feedback with Apple,并在此处发布反馈号,以便其他受影响的人可以自己提交并引用。