【问题标题】:Objective-C: Handling large amounts of images in memoryObjective-C:处理内存中的大量图像
【发布时间】:2012-12-09 05:44:08
【问题描述】:

在内存中处理大量图像时,什么是可接受的解决方案?

目前我正在构建一个照片共享应用程序(在某种意义上类似于 Instagram)。我已经能够模仿他们在提要中快速加载许多图像(结合图像的预加载和延迟加载),但我有点坚持如何处理这些图像可能占用的大量内存有。

CoreData 是用于临时图像存储的选项吗?使用 NSCoder 将对象写入临时目录是另一种选择吗?我正在尝试主动避免内存崩溃,并且我不确定 CoreData、临时文件夹或其他方式是否足够体面,以减少(可能)数百张图像的内存占用,如果用户在他们的提要中滚动漂亮远的。这些也不会是永久性的。

(对于它的价值,现在我为每个包含元数据和图像的图像都有一个对象表示,它们存储在一个基本的数组结构中。它现在运行良好,但我想确定我是否'正在加载数百张图像,我可以减少内存占用,但仍然能够快速访问这些对象)

【问题讨论】:

    标签: iphone objective-c image cocoa-touch memory


    【解决方案1】:

    在我自己的几个应用程序中,我也遇到了这个难题,我不得不在表格视图中显示数百个 UIImage 对象。

    我为我的应用程序所做的一个解决方案是不在内存中存储全分辨率图像,而是一个缩略图(我使用 UIImage+Resize.h category extension available and described here 缩小了它)。一旦用户决定编辑或使用照片,我就会加载整个全分辨率图像。

    您还可以将这些缩略图(或至少它们的图像数据)保存到“~/Library/Caches/”文件夹中的小文件中。

    【讨论】:

      【解决方案2】:

      如果关注的是性能,那么核心数据会为您提供更多粒度。这里可以分部分保存,也可以延迟加载。

      【讨论】:

        【解决方案3】:

        如果您非常简单地存储一堆图像,CoreData 就显得多余了。为了提高效率,无论如何您都必须将其设置为将图像存储在数据库之外,因此它可能最终会更多工作。

        显而易见的方法 - 只是将所有图像保存到某个缓存文件夹中的文件中 - 是合理的(不过,正如我将很快解释的那样,可能没有必要)。然后,您可以根据需要重新创建它们。通过将图像保存在 NSCache 中,其中它们的“成本”是它们的文件大小,并且您施加了一些总成本限制,您可以限制总内存消耗。

        但理想情况下,您可以找到一种方法将图像存储在磁盘上,以便可以直接映射它们。这将让您同时将它们全部映射,VM 系统本质上将为您提供一个有效的 LRU 缓存。不过,它的包含程度较低 - 它们还可能会从您的应用程序的其他部分窃取内存。使用高级图像类(例如 UIImage)找到一种方法也可能很棘手。但是你可以很容易接近 - UIImage 文档说:

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

        因此,您可以使用imageWithContentsOfFile: 创建 UIImage,它们会根据需要清除内存中的图像副本,并在必要时(即再次绘制时)重新加载。不过,他们可能实际上并未映射文件 - 不幸的是,从 iOS 5 开始,-[NSData initWithContentsOfMappedFile:] 已被弃用。

        哪种方法有意义取决于您的使用要求 - 如果您能够可靠地预测您需要哪些图像,手动管理它们可能会给您带来更好的用户体验,因为您会提前加载它们并避免实际绘图过程中的延迟。

        【讨论】:

          猜你喜欢
          • 2011-05-16
          • 1970-01-01
          • 1970-01-01
          • 2013-01-31
          • 1970-01-01
          • 2016-09-02
          • 2016-11-03
          • 2013-07-19
          • 1970-01-01
          相关资源
          最近更新 更多