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

Eit*_*tan 6 instruments uiimagepickercontroller uiimage ios automatic-ref-counting

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

  1. 上传相机拍摄的照片
  2. 压缩图片以用作缩略图.
  3. 我这样做是使用[UIImage imageWithData:UIImageJPEGRepresentation(original,0.1f)]
  4. 我将未压缩的图片引用设置为nil,以便ARC释放内存

重复此序列将意味着屏幕上会显示多个压缩缩略图.大约7或8张照片后,应用程序将因内存不足而崩溃.

在Instruments中,我试图将Allocations与Memory Monitor结合使用来查找问题的根源.

一些仪器统计:

分配 - 拍摄照片后,实时字节跳跃大约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
Run Code Online (Sandbox Code Playgroud)

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

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

ado*_*oho 2

埃坦27,

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

安德鲁