使用乐器减少来自相机的UIImages的记忆

时间:2012-01-12 01:23:08

标签: ios uiimage uiimagepickercontroller instruments automatic-ref-counting

我的应用程序使用ARC,执行以下操作:

  1. 上传相机拍摄的照片
  2. 压缩图片以用作缩略图。
  3. 我使用[UIImage imageWithData:UIImageJPEGRepresentation(original,0.1f)]
  4. 我将未压缩的图片引用设置为nil,以便ARC释放内存
  5. 重复此序列意味着屏幕上会显示多个压缩缩略图。大约7或8张照片后,应用程序将因内存不足而崩溃。

    在Instruments中,我试图与内存监视器一起使用Allocations来查找问题的根源。

    有些乐器的统计数据:

    分配 - 拍摄照片后,实时字节数会跳跃约2 MB,但在原始图片参考设置为nil后会下降1.5 MB。这似乎是一件好事,但是......

    这是应用程序的最终状态。 #Living似乎相对于Live Bytes非常高,对吗?

      Live Bytes  #Living   #Transitory  Overall   #Overall Bytes    
       3.72 MB    24538     80679        90.1 MB   105301
    

    内存监视器(跟踪检查头) - 我的应用程序以7.5 MB启动并拍摄一张图片会导致增加~13 MB。对于我上面列出的状态,Memory Monitor表示应用占用了72.67 MB的“Real Memory”和123.79 MB的虚拟内存。

    鉴于Live Bytes非常小,我知道我正在做正确的事情。 但是,鉴于其他地方的内存占用量很大,我也确定我做错了。任何想法可能是什么,或如何追踪它?

2 个答案:

答案 0 :(得分:2)

Eitan27,

这不是ARC问题。这是关于如何管理内存中的多个大项目。 iOS有几种机制可以帮助您。如果您将图像写入闪存然后重新打开它作为内存映射数据,您将主要解决您的问题。怎么样?操作系统使用不可变数据管理映射到驻留内存占用。因为这些项是不可变的,因此永远不会变脏,所以它可以在必要时刷新映射的页面。这种机制的缺点是每个应用程序可用的文件描述符数量有限。

安德鲁

答案 1 :(得分:0)

使用@autoreleasepool块:

@autoreleasepool {
    //code that inits the UIImage and sets it to nil
}

请参阅 ARC提供管理自动释放池的新语句部分Transitioning to ARC Release Notes