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

处理许多图像时如何管理iPhone上的内存,iphone,memory-management,image,Iphone,Memory Management,Image,在我工作的项目中,我有一个独特的问题。我正在做的是创建一种可滚动图像的“墙”,这些图像可以从服务器下载,我们的用户可以在iPhone上浏览。但问题是,我们很难想出一个好的内存管理计划。我们现在运行的是一个类,它是UIImageView的子类,用于存储我们从服务器下载的每个图像(这些图像保存到应用程序的文档目录),然后我们还向其添加元数据(即描述、标记等)。然后,我们将其存储在一个NSMutableArray中,然后循环使用所有图像将其放置在墙上。正如你想象的那样,将所有这些图像存储在内存中是一个

在我工作的项目中,我有一个独特的问题。我正在做的是创建一种可滚动图像的“墙”,这些图像可以从服务器下载,我们的用户可以在iPhone上浏览。但问题是,我们很难想出一个好的内存管理计划。我们现在运行的是一个类,它是UIImageView的子类,用于存储我们从服务器下载的每个图像(这些图像保存到应用程序的文档目录),然后我们还向其添加元数据(即描述、标记等)。然后,我们将其存储在一个NSMutableArray中,然后循环使用所有图像将其放置在墙上。正如你想象的那样,将所有这些图像存储在内存中是一个巨大的内存消耗。我们很难想出一种不用这么多内存就能做到这一点的方法。其中一个更大的问题使它变得更困难,那就是图像在放置时,需要在被触摸时报告。所以我不认为我们可以在放置它们之后就释放它们。你们中有没有人有过处理像这样大尺寸的物体的经验,并且必须把它们放在手边才能在屏幕上显示、播放等等?你建议采用哪种技术或方法?我读过有关CoreData的文章,但不知道这是否是我要找的。谢谢你的帮助

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


解决方案:WWDC会话视频#104

首先,将它们重新采样到一个合理的大小——大概你只需要它们与屏幕大小差不多或更小。如果你放大,就去拿那张图片的原稿


另外,创建一个自定义视图(UIView的子类),在图像可见时绘制图像(在drawRect中),并在图像离开屏幕时卸载图像。

首先,将其重新采样到合理的大小——大概您只需要它们与屏幕大小差不多或更小。如果你放大,就去拿那张图片的原稿


另外,创建一个自定义视图(UIView的子类),在图像可见时绘制图像(在drawRect中),并在图像离开屏幕时卸载图像。

只要图像来自磁盘,并使用
UIImage
便利方法之一读取,
UIImage
将保留文件的支持,并在需要时释放内存。它还会在需要时重新读取文件。这一切都只是在
UIImage
docs顺便说一下


ps.即使在从iPhone库加载图像时,图像仍由文件支持(您的应用程序无法触摸该文件)。顺便说一句,显示所需的低分辨率版本也保留了下来。您可以清楚地看到仪器中发生了这种情况。如果相机图像也有文件支持,则为。

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


ps.即使在从iPhone库加载图像时,图像仍由文件支持(您的应用程序无法触摸该文件)。顺便说一句,显示所需的低分辨率版本也保留了下来。您可以清楚地看到仪器中发生了这种情况。一个问题是,如果相机图像也有一个文件作为后盾。

那么,实际上,您需要的是一个在视图进出时排队的系统

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

不要将墙视为一个始终可用的单一大视图,而是遵循UITableView所展示的范例。UITableView会在UITableViewCells消失时将其排队,并且(希望如此)数据源只需将显示的信息更改为新行中的信息,即可将这些表单元格排队并重用

报告触摸哪个图像不会有任何问题(因为您可以查看imageview中包含的图像,或者通过其他保存的属性)


上述原则也应适用于UIImage本身;因为您要将它们保存到磁盘,所以不一定需要将它们全部存储在内存中,所以请考虑按需发布和获取它们。需要注意的一点是:当您从磁盘读取图像时,有时滚动速度会非常慢,因此您需要自己进行权衡。

因此,实际上,您需要的是一个视图进出排队系统

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

不要将墙视为一个始终可用的单一大视图,而是遵循UITableView所展示的范例。UITableView会在UITableViewCells消失时将其排队,并且(希望如此)数据源只需将显示的信息更改为新行中的信息,即可将这些表单元格排队并重用

报告触摸哪个图像不会有任何问题(因为您可以查看imageview中包含的图像,或者通过其他保存的属性)

上述原则也应适用于UIImage本身;因为您要将它们保存到磁盘,所以不一定需要将它们全部存储在内存中,所以请考虑按需发布和获取它们。有一件事需要注意:有时