【问题标题】:UIImageView not releasing image data properly?UIImageView 没有正确释放图像数据?
【发布时间】:2012-02-10 11:12:28
【问题描述】:

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

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

【问题讨论】:

    标签: ios memory ios5 uiimageview uiimage


    【解决方案1】:

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

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

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

    【讨论】:

    • 当应用收到内存警告时,理论上不会释放这个缓存吗?尽管有警告,它仍然存在于我的应用中。
    • 是的,我很确定我在某处读到这些缓存在收到内存警告时被清除,所以看起来有问题。我会更新我的答案。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我创建了自己的 [UIImage loadImage:] 类别方法,以便更好地控制缓存的内容和未缓存的内容,此外,我从磁盘而不是应用程序包中读取这些图像,所以imageNamed: 缓存应该不是问题。另外,如果我在 ARC 中,释放这些对象的最佳方式是什么?设置为 nil 似乎不会删除内存。
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多