【问题标题】:UIImageView+AFNetworking on device memory problems for large images (leak?)UIImageView+AFNetworking 关于大图像的设备内存问题(泄漏?)
【发布时间】:2013-07-30 03:06:04
【问题描述】:

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

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

有问题的图片:

这是我在 Instruments 上的结果:

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

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

工作示例:

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

图片: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),虽然我不知道这是否相关。

【问题讨论】:

    标签: ios memory uiimageview afnetworking


    【解决方案1】:

    虽然我认为AFNetworkingUIImageView 类别相当薄弱,但我认为这里的一些(如果不是大部分)责任在于这些巨大的图像。仅仅因为 JPEG 文件的大小合理,并不意味着生成的位图(以及由此产生的 UIImage 对象)的大小也是合理的。

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

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

    【讨论】:

    • 我明白了。那么有没有办法阻止这些巨大的图像加载呢?我们有服务器端调整大小,但它是一个后台作业,可以在创建后几分钟运行。我担心如果用户在此期间访问应用程序会崩溃...(我们延迟调整图像大小并发送到 S3 以防止挂起)
    • 没关系,我们将图像的大小存储在服务器上,所以如果图像大于 1024*1024 像素或其他东西,我就不会将图像发送到应用程序。我还发现了这个相关问题:stackoverflow.com/questions/3679457/…
    • 好的,几个小时后,我找到了防止 AFNetworking 加载大图像的方法。在当前主版本AFImageRequestOperation.m文件中,找到size_t height = CGImageGetHeight(imageRef);,如果大小比需要的大就跳出来。像这样:if (width * height > 2048*2048) { return nil; }。这将在 JPEG 转换为位图之前返回 nil。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多