使用[UIImage imageNamed]时未使用内存警告释放图像

时间:2012-06-05 23:32:05

标签: iphone objective-c ios ipad memory-management

在我的应用中,我使用了

[UIImage imageNamed:imageName] 

每当加载图像时。据我所知,这个函数缓存图像供以后使用 - 这很好,因为大多数图像不止一次使用。

但是 - 当我模拟内存警告时,这些图像使用的内存似乎没有被释放 - 并且因为大多数内存实际上是由缓存的图像使用的,所以当前不需要的任何内存都非常重要图像从内存中释放出来!

-

这是预期的行为,还是图像保留在内存中,因为它只是模拟的内存警告?或者,如果我想发布这些图像,我是否必须为缓存图像的UIImage编写我自己的类别,但在内存供不应求时发布不需要的类别(或者甚至更好,有人已经完成此操作/共享代码) ??

3 个答案:

答案 0 :(得分:4)

我所做的是创建我自己的缓存机制,利用-initWithConentsOfFile不缓存,NSMutableDictionary用于存储,每个分配的图像都存储在字典中,图像名称为关键字。如果达到内存警告,您可以释放并取消字典,从而释放从映像分配的所有内存。

这使您可以完全控制图像缓存。 -imageNamed:使用自己的缓存机制,无法控制释放分配内存的时间和位置。

您也应该尝试这种方法。

编辑:继承我的UIImage类扩展(https://gist.github.com/2880240),使用自定义缓存覆盖-imageNamed:,收到内存警告后,您只需使用[UIImage freeCache]即可。还包括,是在将所有图像存储在缓存中时对所有图像设置自动释放的能力,即:[UIImage setShouldAutorelease:TRUE]。默认为FALSE。

尝试一下,希望它有所帮助!

答案 1 :(得分:0)

如果没有更多的图像引用它应该被清理,不要担心内部缓存机制(因为它的行为无论如何都没有记录)。您是否有任何代码可以删除图像的任何引用(零或发布)?

答案 2 :(得分:0)

您是否在UIImageView中使用它?

许多框架数据会在应用程序进入后台时自动管理。使用imageNamed:加载的图像数据会自动丢弃,但UIImageView不会丢弃其数据,因此可能与低内存警告相同。

P.S。 如果您的应用暂停,它将不会收到内存警告。如果它使用大量内存,那么它可能会被终止。为了减少这种情况的可能性(如果它很重要)那么你可以使用存储在NSCache中的NSPurgeableData,以便在内存不足的情况下将内容标记为可清除,操作系统将为您清除它。 / p>