SwiftUI 不释放列表中已删除单元格的内存

imx*_*eyi 5 ios swift swiftui

如果您创建以下视图的列表作为行:

struct ImageCellView: View {
    let image: UIImage

    init(image: UIImage) {
        self.image = image
    }

    var body: some View {
        return Image(uiImage: image).frame(height: 128).clipped()
    }
}
Run Code Online (Sandbox Code Playgroud)

删除单元格后,UIImage 的内存不会释放,直到添加新单元格。查看内存图,我们可以发现 AGGraphStorage 持有对此的引用:

即使添加新单元格可以以某种方式释放内存,UIImage 偶尔也会泄漏:

这是 SwiftUI 中的错误吗?有什么办法可以摆脱这种行为吗?

Asp*_*eri 1

这是 SwiftUI 中的错误吗?

不它不是。List缓存行以实现重用和性能目的。

有什么办法可以摆脱这种行为吗?

是的,

a) 不要保留UIImage在会员中

b)UIImage在其他地方进行管理并指示将其保持为weak var image: UIImage?

c)在行中处理这个.onDisappear

d) 忽略这一点,因为 List 缓存的行数不会超过屏幕上显示的行数,因此当该行用于其他图像时它将被重置

我更喜欢的是 a) 和 d),具体取决于用例。