ios - 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 中的错误吗?有什么办法可以摆脱这种行为?
解决方案
这是 SwiftUI 中的错误吗?
不它不是。List
缓存行以用于重用和性能目的。
有什么办法可以摆脱这种行为?
是的,
a) 不要保留UIImage
在会员中
b)UIImage
在其他地方管理并在结构中保持它weak var image: UIImage?
c)在行中处理这个.onDisappear
d) 忽略这一点,因为 List 缓存的行数不超过屏幕大小,因此当该行用于其他图像时它将被重置
我更喜欢 a) 和 d),具体取决于用例。
推荐阅读
- excel - 如何排除公式返回零的单元格?
- python-3.x - 带有 *args 的函数的多重赋值
- pine-script - 您能否参考一个单独的图表,而不是应用该策略的图表?
- redux - 故障排除:Redux 和 Redux 开发工具 -- 操作“logjam” -- 操作未出现...然后在下一个操作时立即出现
- python - 为什么我使用 websocket 得到 [SSL: CERTIFICATE_VERIFY_FAILED]?
- angular - Angular 11基于另一个元素的渲染有条件地渲染元素
- java - 阻止 Android Studio 屏幕尺寸
- php - Stomp Over Websocket - CONNECT 数据(无法识别的操作码)
- python - Tkinter 菜单未出现在 MacOS 11.2.2 上
- bash - 为什么我的 Bash sed 命令( sed -e "s/-*[a-zA-Z\-]* / /g" )删除点后的字符?