【发布时间】:2012-02-08 09:11:07
【问题描述】:
我的应用使用 ARC,执行以下操作:
- 上传相机拍摄的照片
- 压缩图片以用作缩略图。
- 我使用 [UIImage imageWithData:UIImageJPEGRepresentation( original, 0.1f )] 进行此操作
- 我将未压缩的图片引用设置为 nil,以便 ARC 释放内存
重复此序列将意味着屏幕上出现多个压缩缩略图。大约 7 或 8 张图片后,应用程序将因内存不足而崩溃。
在 Instruments 中,我尝试将分配与内存监视器结合使用来查找问题的根源。
一些仪器统计数据:
分配 - Live Bytes 在拍照后跳跃约 2 MB,但在原始图片参考设置为零后下降 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。对于我上面列出的状态,内存监视器说应用程序占用了 72.67 MB 的“真实内存”和 123.79 MB 的虚拟内存。
鉴于 Live Bytes 非常小,我知道我在做正确的事情。 但是,鉴于其他地方的内存占用很大,我也确定我做错了什么。任何想法可能是什么,或者如何追踪它?
【问题讨论】:
-
+1 提出一个好问题。您如何加载图像以显示在屏幕上?你在用
[UIImage imageNamed:]吗? -
这一行的目的是什么? [UIImage imageWithData:UIImageJPEGRepresentation( original, 0.1f )] 您正在压缩图像,然后立即解压缩。结果只是浪费了画质和 CPU 时间。
-
@DominikSeibold 我压缩图像以减少内存,然后将其更改为 UIImage 以便我可以将其用作缩略图按钮的背景。
-
图像不会以压缩状态存储在内存中,因此将它们重新压缩为 JPEG 并不会真正为您带来任何好处。您可以为图像做的最重要的事情是调整图像大小并将图像裁剪为缩略图,其中的像素不超过显示所需的像素。分配工具hides some memory usage that Memory Monitor shows,包括内存中图像的总大小,因此您不能依赖其实时字节读数来了解这里的真实故事。
标签: ios uiimage uiimagepickercontroller instruments automatic-ref-counting