众所周知,当使用imageNamed:
方法加载图像时,UIImage会缓存其图像数据。
来自苹果文档: https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed
imageNamed:
讨论:此方法查看 用于图像对象的系统缓存 指定的名称并返回该名称 对象,如果它存在。如果匹配 图像对象尚未出现在 缓存,此方法加载图像 来自指定文件缓存的数据 它,然后返回结果 对象
因此,在使用imageNamed:
加载多个图像后,我注意到内存使用量大幅增加,并且即使在加载图像的控制器被释放后,内存仍然保持使用状态。 (至少当我分配同一个控制器时它没有再增加)
这让我想知道是否有任何方法可以在我的应用程序生命周期的任何给定时间以编程方式清除UIImage使用的缓存,甚至可以控制一些缓存参数(例如,它可以使用的最大内存)
我知道我可以使用initWithData
,imageWithData
,imageWithContentsOfFile
或任何其他初始化程序而不是imageNamed
轻松解决此问题,但是当需要此缓存行为时使用多个图像,例如UITableView
内部。
关于如何实现这一目标的任何想法?
编辑: 在得到一些答案后,我只想说清楚,在需要做某事和有可能做某事之间存在巨大差距。正如我所指出的,我知道操作系统会为我处理缓存,我只是想看看iOS SDK带来的限制。
答案 0 :(得分:7)
我无法手动清除此iOS托管缓存。一般来说,这是一个红鲱鱼。当操作系统为您管理某些内容时,您无需担心它。只要你正确地释放任何你分配/保留和处理内存警告的东西,你就会尽自己的一份力量。
答案 1 :(得分:3)
从Kevin Low评论
中提取答案如果您可以使用私有API (例如,在仅限AdHoc的应用中),请使用此UIImage
method从缓存中删除所有图片
[UIImage _flushSharedImageCache];
答案 2 :(得分:0)
缓存将在需要时清空,即当应用程序收到低内存警告时。您没有理由自己这样做,并且没有可用的公共API。
答案 3 :(得分:-1)
也许我们有更多的一种方法来删除缓存的图像,但是我认为您可以使用self.cache.removeAllObjects()这是使用Cache()对象的更多方法之一。如果我错了,每个人都可以纠正我