有没有办法清除UIImage类使用的缓存?

Fel*_*ino 39 caching objective-c uiimage ios

众所周知,当使用该imageNamed:方法加载图像时,UIImage缓存其图像数据.

来自Apple文档:https: //developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed

imageNamed:

讨论:此方法在系统缓存中查找具有指定名称的图像对象,并返回该对象(如果存在).如果匹配的图像对象是不是已经在高速缓存中,这种方法加载从指定的文件中的图像数据,缓存 ,然后返回生成的对象.

因此,在加载了几个图像后,imageNamed:我注意到内存使用量的大量增加,并且即使在加载图像的控制器被释放后,内存仍然保持使用.(当我分配相同的控制器时,至少它没有再增加)

这让我想知道是否有任何方法可以在我的应用程序生命周期的任何给定时间以编程方式清除UIImage使用的缓存,甚至可以控制一些缓存参数(例如,它可以使用的最大内存)

我知道,我可以很容易地通过解决这个问题initWithData,imageWithData,imageWithContentsOfFile或其他任何初始化代替imageNamed,但这种缓存行为,并使用几种图像时,如内部所需UITableView.

有关如何实现这一点的任何想法?

编辑:经过一些答案后,我只想说清楚,需要做某事和有可能做某事之间存在巨大差距.正如我所指出的,我知道操作系统会为我处理缓存,我只是想看看iOS SDK带来的限制.

XJo*_*nes 7

我无法手动清除此iOS托管缓存.一般来说,这是一个红鲱鱼.当操作系统为您管理某些内容时,您无需担心它.只要你正确地发布任何你分配/保留和适当处理内存警告的东西,你就会尽自己的一份力量.

  • @XJones如果您的应用程序因内存问题而崩溃 - 用户不会责怪操作系统,他们会谴责您的应用程序!所以你可能正在尽自己的一份力量 - 但是用户对此并不了解. (4认同)
  • 我的观点是你不应该担心os托管缓存使用的内存.可以公平地担心应用程序的内存需求,并管理您自己存储或缓存的任何内容.操作系统将根据需要管理它的缓存,除非Apple文档和其他建议,否则实现对您来说是不透明的.您当然可以使用initWithData并实现自己的图像缓存(或不实现).很难想象哪种情况会更好. (3认同)
  • *需要做某事*和*有可能做某事*之间存在巨大差距.正如我在我的问题中指出的那样,我知道我不需要**这样做,因为我可以使用`initWithData`来创建图像,我只是想看看SDK带来的限制. (2认同)

Fel*_*ino 3

答案取自凯文·洛评论


如果您可以使用私有 API(例如,在仅限 AdHoc 的应用程序中),请使用此UIImage方法从缓存中删除所有图像

[UIImage _flushSharedImageCache];
Run Code Online (Sandbox Code Playgroud)

  • UIImage 没有这样的方法。 (5认同)