Objective-C:处理内存中的大量图像

时间:2012-12-09 05:44:09

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

在内存中处理大量图像可能是一种可接受的解决方案?

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

CoreData是临时图像存储的选项吗?是使用NSCoder将对象写入临时目录的另一个选项吗?我正在尝试主动避免内存崩溃,而且我不确定CoreData,一个临时文件夹或其他方法是否足以减少(可能)数百个图像的内存占用量,如果用户在其Feed中滚动的话远。这些也不会是永久性的。

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

3 个答案:

答案 0 :(得分:2)

我在几个自己的应用程序中遇到了这个完全的困境,我必须在表视图中显示数百个UIImage对象。

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

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

答案 1 :(得分:0)

如果关注性能,那么Core数据会为您提供更多粒度。在这里,您可以按部件保存,也可以使用延迟加载。

答案 2 :(得分:0)

如果您只是简单地存储一堆图像,那么CoreData就太过分了。为了提高效率,您必须将其设置为将数据存储在数据库之外,因此最终可能会更多工作。

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

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

  

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

因此,您可以使用imageWithContentsOfFile:创建UIImages,并且他们将根据需要清除其图像的内存副本,并在必要时(即再次绘制时)重新加载它。他们可能实际上并没有映射文件,但不幸的是,从{5}开始不推荐使用-[NSData initWithContentsOfMappedFile:]

哪种方法有意义取决于您的使用要求 - 如果您能够可靠地预测您需要哪些图像,手动管理它们可能会为您提供更好的用户体验,因为您将提前加载它们并避免在实际绘图期间出现延误。