如果您非常简单地存储一堆图像,CoreData 就太过分了。为了提高效率,无论如何您都必须将其设置为将图像存储在数据库之外,因此最终可能需要更多工作。
显而易见的方法 - 将所有图像保存到某个地方的缓存文件夹中的文件 - 是合理的(尽管我将很快解释,可能没有必要)。然后,您可以根据需要重新创建它们。通过将图像保存在 NSCache 中,其中它们的“成本”是它们的文件大小,并且您施加了一些总成本限制,您可以限制总内存消耗。
但理想情况下,您可以找到一种方法将图像存储在磁盘上,以便可以直接映射它们。这将让您同时将它们全部映射,VM 系统本质上将为您提供一个有效的 LRU 缓存。不过,它包含的内容较少 - 它们还可能会从您的应用程序的其他部分窃取内存。使用高级图像类(例如 UIImage)找到一种方法也可能很棘手。但是你可以很容易地接近 - UIImage 文档说:
在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为只影响 UIImage 对象内部存储的图像数据,而不影响对象本身。当您尝试绘制数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的加载步骤可能会导致小的性能损失。
因此,您可以使用创建 UIImage imageWithContentsOfFile:
,它们会根据需要清除内存中的图像副本,并在必要时重新加载(即再次绘制时)。不过,他们实际上可能不会映射文件 --[NSData initWithContentsOfMappedFile:]
不幸的是,从 iOS 5 开始不推荐使用。
哪种方法有意义取决于您的使用要求 - 如果您能够可靠地预测您将需要哪些图像,手动管理它们可能会给您带来更好的用户体验,因为您将提前加载它们并避免实际过程中的延迟绘画。