如何在处理许多图像时管理iPhone上的内存

时间:2010-07-28 18:18:42

标签: iphone memory-management image

我在我正在从事的项目中遇到了一个独特的问题。我正在做的是创建一种可滚动图像的“墙”,这些图像是从我们的用户可以在iPhone上浏览的服务器下载的。但问题是我们在这里制定一个好的内存管理计划时遇​​到了麻烦。我们现在运行的是一个子类UIImageView,它用于存储我们从服务器下载的每个图像(这些图像 保存到应用程序的文档目录中),然后我们也添加元数据(即描述,标签等)。然后我们将它存储在NSMutableArray中,然后我们遍历所有图像以将它们放在我们的墙上。正如您所想象的那样,在内存中存储所有这些图像是一种巨大的记忆力。我们很难想办法在不使用这么多内存的情况下做到这一点。使其变得更加困难的更大问题之一是图像在放置时需要在被触摸时进行报告。所以我认为我们不能在放置它们之后解除它们。你有没有经验处理任何类型的大尺寸物体,并且必须手头拿着它们画到屏幕上,玩耍等等?你建议采用什么类型的技术或方法?我已经了解了CoreData,但不知道这是否是我正在寻找的。感谢任何帮助。

以下是参考的主要绘图方法:

解决方案:WWDC Session Video#104!

4 个答案:

答案 0 :(得分:1)

只要图像来自磁盘,并使用UIImage便捷方法之一读入,UIImage将保留文件支持,并在需要时释放内存。它也会在需要时重新读取文件。这只是在UIImage docs btw。

ps。即使从iPhone库中加载图片,它仍然会受到文件的支持(您的应用无法触及该文件)。 btw还保留了显示所需的低分辨率版本。你可以在仪器中清楚地看到这种情况。如果相机图像也由文件支持,则open question of me就是这样。

答案 1 :(得分:1)

所以,你真正需要的是一个在来来往往时将观点排队和出列的系统。

您应该看到的一个简单示例是iPhone上已存在的照片应用。虽然您的“墙”上可能有一百万张图像,但您只能在屏幕上一次看到这么多图像。这意味着您不需要为墙上的所有图像提供一百万个UIImageViews,只需要适合屏幕上的20个左右。

将墙视为不是一直可用的单一大视图,而是遵循UITableView规定的范例。 UITableView将UITableViewCells排队,因为它们消失,并且(希望)数据源会出现并重新使用这些表格单元格,只需将显示的信息更改为新行中的信息即可。

报告触摸图像的触摸时不应该有任何问题(因为您只需查看图像视图中包含的图像,或通过其他一些保存的属性)。

上述原则也适用于UIImages本身;因为你将它们保存到磁盘上,所以你不一定需要它们都在内存中,所以考虑释放并按需获取它们。需要注意的一点是:当您从磁盘读取图像时,滚动有时会变得很慢,因此您需要自行调查。

答案 2 :(得分:1)

这基本上是solved for you by David Golighty。我们成功地使用了ImageCache代码来处理600多张没有打嗝的图像。由于缓存的工作方式,我们可以轻松地在iPhone和iPad上翻转300个512x512 PNG图像,每秒帧数高。

答案 3 :(得分:0)

首先,将它们重新取样到合理的尺寸 - 大概,你只需要它们大约是屏幕尺寸或更小。如果放大,请获取原始图像。

另外,制作一个自定义视图(UIView的子类),当它在可见时绘制图像(在drawRect中),并在屏幕外显示时卸载图像。