【问题标题】:Caching images in memory on iOS, what is smaller : a UIImage or NSData object?在 iOS 上将图像缓存在内存中,哪个更小:UIImage 或 NSData 对象?
【发布时间】:2011-12-07 18:27:17
【问题描述】:

我正在开发 iOS 上的图像缓存。图像从 URL 下载并作为 UIImage 存储在 NSDictionary 中(我不想要或不需要“磁盘上”缓存)。

问题是:我应该将图像作为 UIImage 还是 NSData 存储在字典中?哪一个在内存方面明显更小?

【问题讨论】:

    标签: ios memory uiimage nsdata


    【解决方案1】:

    UIImage 具有自动响应低内存情况和释放其缓存表示的优化。来自UIImage reference:

    在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为只影响 UIImage 对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的加载步骤可能会导致小的性能损失。

    一般来说,您应该将图像数据留在UIImage

    如果您可以根据需要重新获取图像,则应考虑使用NSPurgeableData 或您自己的 对象,以及NSCache 而不是NSDictionaryNSCache 是存储在其中的特别好的内存,即使您处于挂起状态,操作系统也可以自动释放,避免您在后台被终止。 UIImage 已经为您做了很多这样的事情,但是NSCache 将允许您释放所有数据,而不仅仅是未压缩的数据。

    【讨论】:

    • 我觉得值得一提的是,NSCache 仅在 iOS 4.0 及更高版本中可用
    • 很遗憾,您所说的 UIImage 优化不适用于从服务器加载的 UIImage。
    • @David,虽然加载数据的 UIImage 无法像 imageNamed: 那样清除底层数据,但它们可以清除解码后的表示并释放大量内存。
    • @RobNapier NSPurgeableData 与缓存无关;只有 NSCache 是。它通过确保只有一个数据实例来管理对象内存。您锁定它 (beginContentAccess),使其无法在其他地方引用或创建,然后解锁它 (endContentAccess) 以在其他地方使用,和/或标记它以进行清除 (​​discardContentIfPossible)。因为 UIImage 已经实现了 NSDiscardableContent 协议,所以当你清除 NSPurgeableData 对象时,从该数据创建的 UIImage 的底层数据将被清除。对于任何其他类,您必须手动实现协议。
    【解决方案2】:

    NSData 更小,因为它存储图像的压缩版本。但是decompressing takes time,所以只要内存允许,缓存 UIImage 并在收到内存警告时清理缓存。

    【讨论】:

    • 这就是我目前正在做的事情。完成后,稍后我会收到第二次警告,有时还会收到第三次警告。然后应用程序崩溃。也许我没有找到正确的方向。
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多