UIImageView 不释放内存(根据 VM Tracker) - 内存不足警告和终止
Posted
技术标签:
【中文标题】UIImageView 不释放内存(根据 VM Tracker) - 内存不足警告和终止【英文标题】:UIImageView not releasing memory (according to VM Tracker) - Low Memory Warnings & Terminate 【发布时间】:2013-07-16 01:38:48 【问题描述】:我真的在为我的应用程序内存不足而苦苦挣扎。这些是我正在执行的基本操作,如下所述。请注意,每当用户使用相机拍照时,我都会保存两个不同版本的照片 - 一个是预览(用于快速加载),另一个是高质量的用于稍后缩放和标记。
这是我的操作顺序列表:
-
在应用启动时,显示已在应用中拍摄的图像的缩略图(显然,在应用首次启动时,此列表为空)。
触摸相机按钮启动
UIImagePickerController
用户拍照并保存(同样,保存预览并保存全尺寸照片)
缩略图列表刷新并显示新的预览图像。同样,VM Tracker 工具中“Image IO”的整体大小仍然非常小(最多增加了 0.5MB)。
用户触摸其中一个预览图像,这会启动一个不同的视图控制器,该控制器执行以下操作:
创建新的 UIImageView,加载图像,作为子视图添加到 View Controllers 视图中
突然间,“图像 IO”增加了 30MB。
这没什么大不了的,但是当我返回时(导航控制器弹出),“Image IO”类型和“Dirty”类型的大小都不会减小。就好像 UIImageView 没有被破坏一样。每次我推送这个视图控制器并加载图像时,大小都会增加 30MB,并且弹出永远不会减小它。
我使用的是 ARC,所以我不会自己调用 release,但我希望它会在我弹出视图控制器时被销毁。
仅供参考,我用于保存预览和完整图像的设置是:
预览:[UIImageJPEGRepresentation([UIImage imageWithImage:image scaledToSize:CGSizeMake(300, 400)], 0.4f) writeToFile:previewPath atomically:NO];
已满:[UIImageJPEGRepresentation(image , 0.8f) writeToFile:imagePath atomically:NO];
我主要关心的是 (1) 在弹出包含视图控制器后如何摆脱 UIImage 使用的内存,但我也想知道 (2) 为什么加载时图像为 30MB。
【问题讨论】:
(1) 我已经看到类似的图像视图问题,在弹出控制器之前尝试将其图像设置为“nil”,看看问题是否仍然存在。 (2) 取决于图像的大小,但未压缩的图像可能会占用大量空间(4000x2000)将占用 32MB。如果这是你应该看一下“平铺”的问题(我认为它甚至在 WWDC 中有描述) @MaticOblak,很好的建议。对于 (1),我尝试将包含图像视图的视图设置为 nil,但这不起作用,但你有一个好点。我可以尝试为 UIImageView 和 UIImage 创建一个实例变量,并在弹出之前将两者都设置为 nil(当然是 UIImage 优先),看看是否可行。 (2)感谢您提供的信息——我一定会查一下的。 :) @MaticOblak,#1 成功了!我明确地将 UIImage 和 UIImageView 设置为 nil(不确定是否都需要),果然,它释放了内存。 如果您将此作为答案发布,我会将其标记为已接受的解决方案! 谢谢!! 【参考方案1】:我正在开发图像编辑器应用程序,这对减少内存使用有很大帮助。试试这个
不要使用 [UIImage imageNamed:] 在 ImageView 中加载图像,当图像数量更多时会导致内存问题,
使用这个,
NSString * imgpath= [ [ NSBundle mainBundle] pathForResource:@"imageName" ofType:@"png"];
ImageView.image=[UIImage imageWithContentsOfFile: imgpath];
【讨论】:
【参考方案2】:正如@Matic Oblak 所建议的...
(1) 我已经看到类似的图像视图问题,在弹出控制器之前尝试将其图像设置为“nil”,看看问题是否仍然存在。
结果:我明确地将 UIImage 和 UIImageView 设置为 nil(不确定是否都需要),果然,它释放了内存。
【讨论】:
以上是关于UIImageView 不释放内存(根据 VM Tracker) - 内存不足警告和终止的主要内容,如果未能解决你的问题,请参考以下文章
iOS UIImageView 内存没有在 ARC 上被释放
释放ceche内存echo 3 > /proc/sys/vm/drop_caches释放内存完后需要把drop_caches的值修改回原来默认值吗