SwiftUI-隐藏LazyVGrid会导致内存泄漏

SwiftUI-隐藏LazyVGrid会导致内存泄漏,swift,memory-leaks,swiftui,Swift,Memory Leaks,Swiftui,我有一个LazyVGrid,它显示从远程API获取的一些数据。 当通过按下按钮隐藏LazyVGrid时,我遇到了内存泄漏。只有当LazyVGrid中显示的内容超过了可以显示的内容时,才会出现这种情况 我已经为你准备了一些代码来重现这个漏洞。 这段代码是不是有些标新立异的东西,或者是苹果方面的一个bug?也许有解决办法 import SwiftUI import Foundation import Combine enum FakeAPI { static var fakeData:

我有一个
LazyVGrid
,它显示从远程API获取的一些数据。 当通过按下按钮隐藏
LazyVGrid
时,我遇到了内存泄漏。只有当
LazyVGrid
中显示的内容超过了可以显示的内容时,才会出现这种情况

我已经为你准备了一些代码来重现这个漏洞。 这段代码是不是有些标新立异的东西,或者是苹果方面的一个bug?也许有解决办法

import SwiftUI
import Foundation
import Combine

enum FakeAPI {
    static var fakeData: [Result] {
       return [
            Result(id: 1), Result(id: 2), Result(id: 3), Result(id: 4), Result(id: 5),
            Result(id: 6), Result(id: 7), Result(id: 8), Result(id: 9), Result(id: 10),
            Result(id: 11), Result(id: 12), Result(id: 13), Result(id: 14), Result(id: 15),
            Result(id: 16), Result(id: 17), Result(id: 18), Result(id: 19), Result(id: 20),
            Result(id: 21), Result(id: 22), Result(id: 23), Result(id: 24), Result(id: 25),
            Result(id: 26), Result(id: 27), Result(id: 28), Result(id: 29), Result(id: 30)
       ]
    }

    static func fetchData() -> AnyPublisher<[Result], Error> {
        return Just(fakeData)
            .mapError({ $0 as Error })
            .eraseToAnyPublisher()
    }
}

struct Result: Identifiable {
    let id: Int
}

struct ContentView: View {
    @StateObject private var vm: ViewModel = ViewModel()

    let columns = [
        GridItem(.adaptive(minimum: 200), alignment: .top),
        GridItem(.adaptive(minimum: 200), alignment: .top)
    ]

    var body: some View {
        NavigationView {
            ScrollView {
                Button {
                    vm.hide = true
                } label: {
                    Text("Hide")
                }
                if !vm.hide {
                    LazyVGrid(columns: columns) {
                        ForEach(vm.results) { result in
                            Text("\(result.id)")
                                .frame(width: 120, height: 120)
                                .background(Color.red)
                        }
                    }
                }
            }
            .navigationTitle("Grid Memory Leak")
            .onAppear {
                vm.load()
            }
        }
    }
}

final class ViewModel: ObservableObject {
    @Published private(set) var results: [Result] = []
    @Published var hide = false

    private var subscriptions = Set<AnyCancellable>()

    func load() -> Void {
        FakeAPI.fetchData()
            .sink(receiveCompletion: { _ in }, receiveValue: { [weak self] results in
                self?.results = results
            })
            .store(in: &subscriptions)
    }
}
导入快捷界面
进口基金会
进口联合收割机
埃姆假API{
静态var fakeData:[结果]{
返回[
结果(id:1)、结果(id:2)、结果(id:3)、结果(id:4)、结果(id:5),
结果(id:6)、结果(id:7)、结果(id:8)、结果(id:9)、结果(id:10),
结果(id:11)、结果(id:12)、结果(id:13)、结果(id:14)、结果(id:15),
结果(id:16)、结果(id:17)、结果(id:18)、结果(id:19)、结果(id:20),
结果(id:21)、结果(id:22)、结果(id:23)、结果(id:24)、结果(id:25),
结果(id:26)、结果(id:27)、结果(id:28)、结果(id:29)、结果(id:30)
]
}
静态func fetchData()->AnyPublisher{
仅返回(伪造数据)
.mapError({$0作为错误})
.删除任何发布者()
}
}
结构结果:可识别{
让id:Int
}
结构ContentView:View{
@StateObject私有变量vm:ViewModel=ViewModel()
让列=[
GridItem(.adaptive(最小值:200),对齐方式:。顶部),
GridItem(.adaptive(最小值:200),对齐方式:。顶部)
]
var body:一些观点{
导航视图{
滚动视图{
钮扣{
vm.hide=true
}标签:{
文本(“隐藏”)
}
如果!vm.hide{
LazyVGrid(列:列){
ForEach(vm.results){result in
文本(“\(result.id)”)
.框架(宽度:120,高度:120)
.背景(颜色.红色)
}
}
}
}
.navigationTitle(“网格内存泄漏”)
奥纳佩尔先生{
vm.load()
}
}
}
}
最终类ViewModel:ObservableObject{
@已发布的专用(集)var结果:[结果]=[]
@发布的变量hide=false
私有变量订阅=Set()
func load()->Void{
FakeAPI.fetchData()
.sink(receiveCompletion:{uIn},receiveValue:{[weak self]导致
自我?.results=结果
})
.store(位于:&订阅中)
}
}