ios - 使用 UIImage(data:) 时如何释放缓存的图像?
问题描述
我注意到收藏视图中的图像缓存占用了大量内存,需要了解如何释放它。UIImage(named:)
我理解和之间的区别UIImage(contentsOfFile:)
。但是,我正在使用UIImage(data:)
,但似乎找不到任何关于在这种情况下释放图像缓存的文档。任何帮助表示赞赏。这是我的代码片段:
if let setImage = cell?.viewWithTag(101) as? UIImageView {
if let url = URL(string: imageURLs[indexPath.item]) {
let task = URLSession.shared.dataTask(with: url, completionHandler: { data, _, error in
guard let data = data, error == nil else {
print("No data detected: \(Error.self)")
return
}
DispatchQueue.main.async {
let newImageData = UIImage(data: data)
self.imageData[indexPath.item] = newImageData!
setImage.image = self.imageData[indexPath.item] as? UIImage
}
})
task.resume()
URLSession.shared.finishTasksAndInvalidate()
}
}
解决方案
UIImage(data:)
不存储在系统映像缓存中。所以,如果你从你的 中删除所有对相关图像的引用imageData
,确保图像视图被释放,等等,你应该很好。
如果imageData
是简单的集合,请考虑将其设置为NSCache
,您可以在其中限制总计数或成本。此外,我们经常采用两层缓存机制(内存限制更小,持久存储缓存更大)。
您可能会考虑使用众多第三方库之一(AlamofireImage、KingFisher、SDWebImage 等),因为它们倾向于采用不错的缓存策略,让您摆脱困境。它们也都提供了不错的“异步图像”扩展UIImageView
。(例如,如果您快速滚动浏览大型集合视图,您与我们共享的实现将遭受积压问题,这些UIImageView
扩展很容易解决问题。)您UICollectionViewDataSource
真的不应该被这种代码所累.
推荐阅读
- imagemagick - Imagick一旦设置就不会反映重力
- celery - AssertionError: 守护进程不允许有子进程
- docker - 由于时间不匹配,Terraform 应用失败
- reactjs - 反应'componentWillReceiveProps'使用
- angular - 解析 url 期间的 Angular Http 失败
- java - 如何使用apache poi处理excel文件中的空单元格或空白单元格
- php - 如何从移动版本中删除滑块而不仅仅是隐藏它?
- java - 如何摆脱此代码中对 null 和 if-else if 签名的检查?
- bash - ANSI转义码在行尾的奇怪行为
- javascript - ReactJS 在表的 tbody 内嵌套循环