我在加载 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)
使用 Activity Monitor 仪器我得到了这个(看似荒谬的)内存结果:187MB 真实内存/535 虚拟内存。
工作示例:
下面是来自同一站点的另一个(更大的)图像的结果。
图片: http://www.nasa.gov/sites/default/files/2013-3051.jpg (5MB)
还有事件监视器:
使用模拟器:
在模拟器上,第一张图片不会让应用崩溃,但与工作图片相比,它仍然有一个奇怪的模式:
有问题的图片:
工作图像:
设置详情:
- 部署目标:6.0
- Xcode 版本:4.6.3 (4H1503)
- iPad Mini iOS 版本:6.1.3 (10B329)
- iPad Mini 可用磁盘空间:13.7GB 容量中有 334MB
我无法弄清楚第一张图片有什么问题以及为什么它会像那样炸毁内存。我确实注意到它有很多像素 (12150×6075),但我不知道这是否相关。
最佳答案
虽然我认为 AFNetworking
的 UIImageView
类别非常薄弱,但我认为这里的部分(如果不是大部分)责任归咎于这些巨大的图像。仅仅因为 JPEG 文件的大小合理,并不意味着生成的位图(因此,可能是生成的 UIImage
对象)的大小也合理。
第一张图片经过大量压缩,生成的位图至少比原始 JPEG 大一个数量级。第二个 JPEG 的压缩效果也不错,但不如第一个 JPEG 那样引人注目,因此第二个 JPEG 的位图不如第一个大。
在处理这种尺寸的图像时,您要么让服务器根据屏幕分辨率调整它们的大小,要么采用一些平铺解决方案。不能指望内存有限的设备能够优雅地处理这些大小的图像。
关于ios - UIImageView+AFNetworking 处理大图的设备内存问题(泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17937643/