问题描述
如果您在 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 (将#修改为@)