在我的应用中,我使用了
行[UIImage imageNamed:imageName]
每当加载图像时。据我所知,这个函数缓存图像供以后使用 - 这很好,因为大多数图像不止一次使用。
但是 - 当我模拟内存警告时,这些图像使用的内存似乎没有被释放 - 并且因为大多数内存实际上是由缓存的图像使用的,所以当前不需要的任何内存都非常重要图像从内存中释放出来!
-
这是预期的行为,还是图像保留在内存中,因为它只是模拟的内存警告?或者,如果我想发布这些图像,我是否必须为缓存图像的UIImage编写我自己的类别,但在内存供不应求时发布不需要的类别(或者甚至更好,有人已经完成此操作/共享代码) ??
答案 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>