Ios 大(UI)映像内存管理

Ios 大(UI)映像内存管理,ios,objective-c,image,ipad,memory,Ios,Objective C,Image,Ipad,Memory,我正在开发一款只支持iPad的iOS应用程序,它可以从Dropbox下载大型高质量图像(JPEG),并在UIScrollView和UIImageView中显示所选图像,允许用户缩放和平移图像 该应用程序主要用于向有意购买相框印刷品的潜在客户展示图像。它的工作方式是首先显示、缩放和平移图像,以显示潜在客户是否喜欢该图像。如果他们确实喜欢,他们可以决定是否要裁剪特定区域(同时保持特定的纵横比/大小),最终图像(裁剪或不裁剪)将作为电子邮件附件发送到生产部门 我现在面临的问题是,即使应用程序只在新的i

我正在开发一款只支持iPad的iOS应用程序,它可以从Dropbox下载大型高质量图像(JPEG),并在UIScrollView和UIImageView中显示所选图像,允许用户缩放和平移图像

该应用程序主要用于向有意购买相框印刷品的潜在客户展示图像。它的工作方式是首先显示、缩放和平移图像,以显示潜在客户是否喜欢该图像。如果他们确实喜欢,他们可以决定是否要裁剪特定区域(同时保持特定的纵横比/大小),最终图像(裁剪或不裁剪)将作为电子邮件附件发送到生产部门

我现在面临的问题是,即使应用程序只在新的iPad上运行(例如,更多内存等),我也找不到处理图像的方法,这样应用程序就不会收到内存警告,然后崩溃

大多数图像的大小为4256x2832,这使每个图像的内存使用至少达到40MB。虽然我一次只显示一个图像,但图像裁剪(这是目前的主内存/崩溃问题)会创建一个新的裁剪图像,这会使应用程序的RAM总使用量瞬间增加到120MB左右,从而导致崩溃

简言之:我正在寻找一种方法来管理非常大的图像,能够裁剪它们,裁剪后仍然有足够的内存将它们作为电子邮件附件发送


我一直在考虑实现一个单例图像管理器,所有视图都会使用它,一次只包含一个大图像,但我不确定这是正确的方法,或者它是否有任何帮助。

处理这个问题的一种方法是平铺图像。您可以将解压缩后的大图像作为一系列平铺保存到“磁盘”中,当用户四处平移时,只拉出需要实际显示的平铺。您一次只需要在内存中使用一个磁贴,因为您将其绘制到屏幕上,然后将其扔掉并加载下一个磁贴。(您可能希望将可见分幅缓存在内存中,但这是一个实现细节。即使将整个图像作为分幅,也可以减轻内存压力,因为您不需要一个大的连续块。)这就是Photoshop等应用程序处理这种情况的方法。

我最终解决了这个问题。由于我无法在Dropbox中调整原始文件的大小(客户端有其原因),所以我继续使用了Dropbox,它本质上只是一个用于快速调整图像大小的快速线程安全库

使用这个库,我注意到以前每张图像占用40-60MB内存的图像,现在似乎只占用了大约一半的内存。此外,调整大小的速度如此之快,以至于原始图像从内存中释放的速度如此之快,以至于iOS不会执行内存警告


有了这些,我对这个应用程序有了进一步的了解,我感谢所有的想法、建议和评论。我希望这能让应用程序完成,我能尽可能远离大图像处理,呵呵。

如果你达到了内存的物理边界,你就无能为力了。也许你可以在下载后缩小图像的比例并裁剪这些图像?我相信AFNetworking对于下载图像和管理某种内部缓存非常有用。此外,您应该使用类似于
UICollectionView
的东西,而不是使用
uicrollview
,它将重用
UIImageView
对象。一旦在您的
UIImageView
s中替换了图像,您的内存也应该被清空。@MrBr在查看图像时,甚至在裁剪图像时,我完全可以缩小图像的比例,但当我需要能够将图像发送到“生产”时,我就需要(裁剪或不裁剪)了高质量图像。@GuyKogus我目前正在使用Dropbox的同步API,它缓存文件,然后我只在需要时将图像加载到内存中。由于当前的实现在其他方面运行良好,因此我宁愿使用UIScrollView。不过,我可能会将共享UIImageView添加到图像管理器单例中,不知道这是否会有帮助(甚至会起作用)。仅仅发送到公共图像的下载链接并不能满足您的需要?我以前读过苹果公司实施平铺图像的情况,但它也可以用于裁剪吗?不要误解我的意思,我喜欢平铺它们的想法,但是如果它需要对已经工作的功能进行剧烈的更改(除了实现平铺图像),我认为我不能及时满足最后期限。对我来说,快速轻松地实现平铺需要创建一个UICollectionView,其中每个单元格都是图像的平铺。这将考虑单元/图像视图的重用,永远不必在内存中保留超出需要的内容。可能没有photoshop或apple那么先进,但它应该可以减轻一些内存压力。虽然我不知道缩放和裁剪是如何工作的…缩放和裁剪(在用户交互期间)应该只是一个视图转换。它不应该以任何方式影响底层图像数据。一旦需要将图像通过电子邮件发送到打印机,则可以进行实际裁剪。这可能需要一些工作来实现,但您必须将其与您试图解决的问题进行权衡。