ios - UIImageView+AFNetworking 处理大图的设备内存问题(泄漏?)

标签 ios memory uiimageview afnetworking

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

当我在我的 iPad mini 上运行该应用程序时,它在能够显示图像之前崩溃了。我创建了一个仅执行此操作(加载和显示图像)的示例应用程序,以便查明问题所在。 You can download it here.

有问题的图片:

这是我在 Instruments 上的结果:

图片: 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 真实内存/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),但我不知道这是否相关。

最佳答案

虽然我认为 AFNetworkingUIImageView 类别非常薄弱,但我认为这里的部分(如果不是大部分)责任归咎于这些巨大的图像。仅仅因为 JPEG 文件的大小合理,并不意味着生成的位图(因此,可能是生成的 UIImage 对象)的大小也合理。

第一张图片经过大量压缩,生成的位图至少比原始 JPEG 大一个数量级。第二个 JPEG 的压缩效果也不错,但不如第一个 JPEG 那样引人注目,因此第二个 JPEG 的位图不如第一个大。

在处理这种尺寸的图像时,您要么让服务器根据屏幕分辨率调整它们的大小,要么采用一些平铺解决方案。不能指望内存有限的设备能够优雅地处理这些大小的图像。

关于ios - UIImageView+AFNetworking 处理大图的设备内存问题(泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17937643/

相关文章:

iphone - 如何创建多阶段 UIImageView 动画?

ios - 如何在 CollectionView 中自动布局 ImageView 以便单元格到边缘的间距与内部单元格间距相同?

ios - 无法接触我的 UIImageView - iOS

ios - 我想在 dispatch_async 任务之后移动到另一个 View Controller

sql-server - 有没有办法在我的 C# 应用程序中复制内存无法读取错误消息?

objective-c - 阻止导航 Controller 导航并要求用户确认

c - 如何使用已调整的指针安全地释放内存

python - 调用 storage() 方法时,Pytorch Tensor 存储具有相同的 id

objective-c - iOS5页面类似 View

ios - 在 iOS 中更改像素的最佳方法,swift