【问题标题】:SwiftUI - Possible Memory LeakSwiftUI - 可能的内存泄漏
【发布时间】:2020-01-23 19:33:51
【问题描述】:

我最近开始研究 SwiftUI,并浏览了一些推荐基于状态交换视图的教程(参见下面的 sn-p)。但是,我在调试时注意到,即使是最基本的 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")
        }
    }
}

【问题讨论】:

    标签: swift user-interface memory-leaks swiftui


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢约翰。我测试了更多组件,发现使用相同示例的 List、ScrollView、Form 和 NavigationViews 存在问题。参考编号:FB7318839
    • 对我来说这是两个带有空导航视图的选项卡。在选项卡之间切换会增加内存使用量。
    • 我看到了类似的问题。 Big Sur 11.0.1 似乎已解决此问题 - 正式版本,而不是 Beta RC 版本。
    • 在 iOS 14.2 上与 TabViews PageTabViewStyle 相同...每次切换页面时,内存使用量都会增加