关于大图像的设备内存问题的UIImageView + AFNetworking(泄漏?)

时间:2013-07-30 03:06:05

标签: ios memory uiimageview afnetworking

我在使用AFNetworking的UIImageView类别加载this 2.8MB image时遇到了问题。

当我在iPad mini上运行应用程序时,它会崩溃,然后才能显示图像。我创建了一个示例应用程序,只执行该操作(加载并显示图像)以查明问题。 You can download it here.

有问题的图片:

以下是我在仪器上的结果:

图片: http://www.nasa.gov/images/content/712130main_8246931247_e60f3c09fb_o.jpg(2.8MB)

Instruments window for the app with the problematic image

使用Activity Monitor工具我得到了这个(看似荒谬的)内存结果: 187MB real mem / 535虚拟内存。

Activity Monitor instrument for the problematic image

工作示例:

以下是来自同一网站的另一张(更大)图片的结果。

图片: http://www.nasa.gov/sites/default/files/2013-3051.jpg(5MB)

Instruments window for the app with the ok image

使用活动监视器:

Activity Monitor instrument for the ok image

使用模拟器:

在模拟器上,第一张图片不会使应用程序崩溃,但与工作图像相比,它仍然有一个奇怪的模式:

有问题的形象:

Instruments for simulator with problematic image

工作图片:

Instruments for simulator with ok image

设置详细信息:

  • 部署目标:6.0
  • Xcode版本:4.6.3(4H1503)
  • iPad Mini iOS版本:6.1.3(10B329)
  • iPad Mini可用磁盘空间:13.7GB容量中的334MB

我无法弄清楚第一张图片出了什么问题,以及为什么它会像这样炸毁记忆。我注意到它有很多像素(12150×6075),虽然我不知道这是否相关。

1 个答案:

答案 0 :(得分:1)

虽然我认为UIImageView的{​​{1}}类别非常弱,但我认为一些(如果不是大多数)责任在于这些巨大的图像。仅仅因为JPEG文件的大小合理,并不意味着生成的位图(因此,可能是生成的AFNetworking对象)的大小也合理。

第一张图片享受大量压缩,并且生成的位图至少比原始JPEG大一个数量级。第二个JPEG也享有不错的压缩效果,但不像第一个JPEG那样具有戏剧性,因此第二个JPEG的位图没有第一个那样大。

处理此大小的图像时,您要么让服务器调整大小以获得屏幕分辨率,要么使用一些切片解决方案。有限内存的设备不能优雅地处理这些尺寸的图像。