2

在我的应用程序中,我使用了这条线

[UIImage imageNamed:imageName] 

每当加载图像。据我了解,此功能会缓存图像以供以后使用 - 这很棒,因为大多数图像都被多次使用。

但是 - 当我模拟内存警告时,这些图像使用的内存似乎没有被释放 - 因为大部分内存实际上是由缓存的图像使用的,所以释放任何当前不需要的图像非常重要从记忆里!

-

这是预期的行为,还是图像是否保留在内存中,因为它只是一个模拟的内存警告?或者,如果我想发布这些图像,我是否必须为 UIImage 编写自己的类别来缓存图像但在内存短缺时释放不需要的图像(或者更好的是,有人已经这样做了/共享了它的代码) ??

4

3 回答 3

4

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

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

你也应该试试这个方法。

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

试试看,希望对你有帮助!

于 2012-06-06T00:40:39.743 回答
0

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

于 2012-06-05T23:43:22.417 回答
0

你在 UIImageView 中使用它吗?

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

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

于 2012-06-05T23:43:38.273 回答