UIImageView无法正确发布图像数据?

时间:2012-01-14 18:18:56

标签: ios memory ios5 uiimageview uiimage

在最简单的形式中,我的应用程序显示10个UIImageViews,每个都包含一个图像。即使所有UIImageView都包含图像,我的应用程序使用的内存足够小。但是,有一个按钮可以通过将所有图像设置为nil来清除所有UIImageViews。问题是,当检查仪器中的内存监视器时,UIImageViews保存的内存不会消失。这不会出现在Allocations工具中,确认剩余的内存占用不是对象,而是基于图形的内存。如果我将图像的大小调整为更小或更大的值,则剩余的内存也会分别更小或更大。

为什么在UIImageView的图像设置为nil后图像数据仍然存在?

2 个答案:

答案 0 :(得分:1)

我相信UIKit会保留图像缓存以供重复使用。 UIImageView可能正在释放该对象,但出于性能原因会保留副本。

但是,这些图像应在收到内存警告时释放。如果他们不是,我会检查两个地方:

  1. 确保正在释放UIImageView。使用Allocations Instrument分析您的应用程序,并在程序中执行您需要执行的任何操作以加载这些图像。然后卸载图像并搜索UIImageView。只要您确定您的程序应该已经发布了所有这些程序,如果您在搜索中发现任何问题,那么您就知道出现了问题。
  2. 我还会检查图像创建的任何位置,例如:UIImage = [UIImage imageName:@"Foo.jpg"];确保这些图像也被释放。您可以使用分配来查找UIImage类,但是更难以清除那些应该/不应该存在的类。
  3. 运行静态分析器:在Xcode 4中,它位于Products - >下。分析。这是一个很好的工具,用于查找逻辑错误,过度/不足释放(如果您不使用ARC)等。

答案 1 :(得分:-1)

在实际发布UIImageViews之前,它们的内存将保持分配状态。此外,如果您在UIImage上使用便捷方法来获取图像,例如:

UIImage *myImage = [UIImage imageNamed:@"myImage"];

请注意,您的图片可能会被iOS隐藏在幕后,因此即使您正在发布图像,内存占用仍可能反映内存中图像的存在(最终iOS会释放它,所以这不应该对您的资源消耗产生负面影响。)