使用UIImagedata :)时如何释放缓存的图像?

问题描述

我在集合视图中注意到图像缓存中的大量内存使用,因此需要了解如何释放它。我了解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这类代码实在不应该让您感到负担。

,

给我的印象是Firestore自动缓存适用于云存储,但仅适用于云数据库。使用NSCache实施本地缓存后,问题就解决了。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...