Iphone 目标C:处理内存中的大量图像

Iphone 目标C:处理内存中的大量图像,iphone,objective-c,image,cocoa-touch,memory,Iphone,Objective C,Image,Cocoa Touch,Memory,处理内存中大量图像的可接受解决方案是什么 目前,我正在构建一个照片共享应用程序(在某种意义上类似于Instagram)。我已经能够模拟他们在提要中快速加载许多图像(结合图像的预加载和延迟加载),但我有点困惑于如何处理这些图像可能会占用的大量内存 CoreData是临时图像存储的选项吗?使用NSCoder将对象写入临时目录是另一个选项吗?我正试图主动避免内存崩溃,我不确定CoreData、临时文件夹或其他方式是否足以减少(可能)数百个图像的内存占用(如果用户在其提要中滚动很远)。这些也不是永久性的

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

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

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


(值得一提的是,现在我为每个包含元数据和图像的图像都提供了一个对象表示,它们存储在一个基本的数组结构中。它目前运行良好,但我想确保如果我加载了数百个图像,我可以减少内存占用,但仍然能够快速访问这些对象)

如果性能是一个问题,那么核心数据将为您提供更高的粒度。在这里,您可以通过部件保存它,您也可以使用延迟加载。

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

我为我的应用程序所做的一个解决方案是,不将全分辨率图像存储在内存中,而是存储一个缩略图(我使用。一旦用户决定编辑或使用照片,我就会加载整个全分辨率图像


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

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

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

但理想情况下,您可以找到一种将图像存储在磁盘上的方法,以便可以直接映射它们。这将允许您同时映射它们,虚拟机系统将为您提供一个有效的LRU缓存。不过,它的内容较少——它们还可能从应用程序的其他部分窃取内存。使用高级映像类(例如UIImage)也可能很难找到实现这一点的方法。但是你可以很容易地接近——UIImage文档中说:

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

因此,您可以使用
imageWithContentsOfFile:
创建UIImages,它们将根据需要清除其内存中的图像副本,并在必要时(即再次绘制时)重新加载它。虽然-
-[NSData INITWITH CONTENTS OFMAPPEDFILE::
从iOS 5开始就被弃用,但它们可能不会实际映射文件

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