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

标签: iosswiftmemory-managementuiimageimage-caching

解决方案


UIImage(data:)不存储在系统映像缓存中。所以,如果你从你的 中删除所有对相关图像的引用imageData,确保图像视图被释放,等等,你应该很好。

如果imageData是简单的集合,请考虑将其设置为NSCache,您可以在其中限制总计数或成本。此外,我们经常采用两层缓存机制(内存限制更小,持久存储缓存更大)。

您可能会考虑使用众多第三方库之一(AlamofireImage、KingFisher、SDWebImage 等),因为它们倾向于采用不错的缓存策略,让您摆脱困境。它们也都提供了不错的“异步图像”扩展UIImageView。(例如,如果您快速滚动浏览大型集合视图,您与我们共享的实现将遭受积压问题,这些UIImageView扩展很容易解决问题。)您UICollectionViewDataSource真的不应该被这种代码所累.


推荐阅读