ios – 大型(UI)图像内存管理

我正在开发一款仅限iPad的iOS应用程序,该应用程序主要从DropBox下载大型高质量图像(JPEG),并在UIScrollView和UI ImageView中显示所选图像,允许用户缩放和平移图像.

该应用程序主要用于向有兴趣购买它们作为框架打印的潜在客户显示图像.它的工作方式是首先显示,缩放和平移图像,以显示潜在客户,如果他们喜欢图像.如果他们喜欢它,他们可以决定是否要裁剪特定区域(同时保持特定的宽高比/大小),然后将最终图像(裁剪或不裁剪)作为电子邮件附件发送到制作.

我已经面临一段时间的问题是,即使应用程序只能在新的iPad上运行(即更多内存等),我也无法找到处理图像的方法以便应用程序没有内存警告,然后崩溃.

大多数图像的大小为4256×2832,每个图像的内存使用量至少为40MB.虽然我一次只显示一个图像,但图像裁剪(目前主要的内存/崩溃问题)是创建一个新的裁剪图像,这反过来会暂时将应用程序的总RAM使用率提高到大约120MB,从而导致崩溃.

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

我一直在考虑实现一个单独的图像管理器,所有的视图都会使用它,并且它一次只能包含一个大图像,但我不确定这是否是正确的方法,或者即使它是以任何方式提供帮助.

解决方法

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...