SwiftUI - 可能存在内存泄漏

13

我最近开始研究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个回答

5

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

我认为这是List的一个bug,因为如果将List更改为另一种类型的视图,则问题消失了,并且在使用所有其他类型的视图时,我没有注意到它。

我建议您向Apple提供反馈文件,并在此处发布反馈号码,以便其他受影响的人可以提交自己的反馈并引用它。


4
谢谢 John。我测试了几个组件,发现在同一个示例中 List、ScrollView、Form 和 NavigationViews 存在问题。参考编号:FB7318839。 - WafflesRightMeow
对我来说,这是两个带空NavigationView的选项卡。在选项卡之间切换会增加内存使用量。 - Alex
我遇到了类似的问题。这个问题似乎已经在Big Sur 11.0.1中得到解决 - 正式发布版本,而不是Beta RC版本。 - Philip Pegden
在iOS 14.2上,使用TabViews PageTabViewStyle也是一样的问题...每次切换页面时,内存使用量都会增加。 - MaximeHeckel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接