【发布时间】:2011-12-07 18:27:17
【问题描述】:
我正在开发 iOS 上的图像缓存。图像从 URL 下载并作为 UIImage 存储在 NSDictionary 中(我不想要或不需要“磁盘上”缓存)。
问题是:我应该将图像作为 UIImage 还是 NSData 存储在字典中?哪一个在内存方面明显更小?
【问题讨论】:
我正在开发 iOS 上的图像缓存。图像从 URL 下载并作为 UIImage 存储在 NSDictionary 中(我不想要或不需要“磁盘上”缓存)。
问题是:我应该将图像作为 UIImage 还是 NSData 存储在字典中?哪一个在内存方面明显更小?
【问题讨论】:
UIImage 具有自动响应低内存情况和释放其缓存表示的优化。来自UIImage reference:
在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为只影响 UIImage 对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的加载步骤可能会导致小的性能损失。
一般来说,您应该将图像数据留在UIImage。
如果您可以根据需要重新获取图像,则应考虑使用NSPurgeableData 或您自己的 对象,以及NSCache 而不是NSDictionary。 NSCache 是存储在其中的特别好的内存,即使您处于挂起状态,操作系统也可以自动释放,避免您在后台被终止。 UIImage 已经为您做了很多这样的事情,但是NSCache 将允许您释放所有数据,而不仅仅是未压缩的数据。
【讨论】:
imageNamed: 那样清除底层数据,但它们可以清除解码后的表示并释放大量内存。
NSData 更小,因为它存储图像的压缩版本。但是decompressing takes time,所以只要内存允许,缓存 UIImage 并在收到内存警告时清理缓存。
【讨论】: