首页 > 解决方案 > 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()
    }
}

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

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

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

标签: iosswiftswiftui

解决方案


这是 SwiftUI 中的错误吗?

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

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

是的,

a) 不要保留UIImage在会员中

b)UIImage在其他地方管理并在结构中保持它weak var image: UIImage?

c)在行中处理这个.onDisappear

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

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


推荐阅读