2012-06-05 52 views
2

在我的应用程序,我每当加载图像所用的线图片[UIImage的imageNamed]

[UIImage imageNamed:imageName] 

。据我了解,这个功能缓存图像供以后使用 - 这是很好的,因为大多数图像不止一次使用。

但是 - 当我模拟内存警告时,这些图像所使用的内存似乎没有被释放 - 而且由于大部分内存实际上都是由缓存图像使用的,所以当前任何不需要的图像从内存中释放!

-

这是预期的行为,或在图片由于它只是一个模拟内存警告保留在内存中?或者,如果我想发布这些图像,我是否必须为UIImage编写自己的类别缓存图像,但是当内存不足时会释放不需要的内容(或者更好,有人已经完成此任务/为其共享代码) ??

回答

4

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

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

你也应该试试这个方法。

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

试一试,希望它有帮助!

+0

随意标记我的答案是正确的,如果它满足您的需求。 :) – skram

0

如果没有更多的图像引用它应该清理干净,不要担心内部缓存机制(因为无论如何它的行为是无证的)。你是否有任何代码去除图像中的任何引用(零或释放)?

+0

我正在使用ARC,所以我认为这应该全部为我处理? –

+0

仍然没有感受到爱的ARC ..我想你仍然可以对自己的记忆警告作出反应,并将图像设置为零?我也想知道你如何衡量内存不被释放的事实。 – Jake

+0

我正在使用仪器来观察内存使用情况。是啊,看来我可能必须将图像设置为零,ARC才能在这种情况下工作,我会尽快进行测试! –

0

你在UIImageView中使用它吗?

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

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

+0

是的,UIImageViews没有被显示/已经从他们的高级视图中删除似乎没有释放任何内存。我正在使用ARC,如果我想让它们被释放,在使用ARC时是否需要将这些imageView设置为零? –

+0

似乎如此。此外,如果您的图片非常大,则通常应在移入背景之前将其删除。但是,解压缩图像可能会很长,因此如果您释放它们,它将作出判断。您需要对应用程序进行配置文件决定。如果删除加载的图片等使得从后台恢复像从终止状态启动应用程序一样昂贵,则应用程序中没有任何点被暂停。 – Gruntcakes

相关问题