【发布时间】:2019-10-23 04:02:31
【问题描述】:
众所周知,UIImage 在使用imageNamed: 方法加载图像时会缓存其图像数据。
来自苹果文档: https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed
imageNamed:
讨论:这个方法在 图像对象的系统缓存 指定的名称并返回 对象(如果存在)。如果一个匹配 图像对象尚未在 缓存,此方法加载图像 来自指定文件的数据,缓存 it,然后返回结果 对象。
因此,在使用imageNamed: 加载多个图像后,我注意到内存使用量大幅增加,并且即使在加载图像的控制器被释放后,内存仍处于使用状态。 (至少当我分配同一个控制器时它没有再次增加)
这让我想知道是否有任何方法可以在我的应用程序生命周期的任何给定时间以编程方式清除 UIImage 使用的缓存,甚至控制一些缓存参数(例如它可以使用的最大内存)
我知道我可以通过使用initWithData、imageWithData、imageWithContentsOfFile 或任何其他初始化程序而不是 imageNamed 轻松解决这个问题,但是在使用多个图像时需要这种缓存行为,比如在 @ 987654329@.
关于如何实现这一点的任何想法?
编辑: 在回答了一些问题后,我只想明确指出,需要做某事和有可能做某事之间存在巨大差距。正如我所指出的,我知道操作系统会为我处理缓存,我只是想了解 iOS SDK 施加的限制。
【问题讨论】:
-
我知道这是一个老问题,但编辑是新的......我知道手动清除缓存的唯一方法是通过一种未记录的私有方法,所以我认为这不太可能。
-
@KevinLow 真的吗?那是什么方法?我会很高兴和它一起玩!私有 API 规则不适用于仅临时应用程序 ;)
-
哈哈,是UIImage上的类方法。
[UIImage _flushSharedImageCache];还有[image removeFromCache];和[UIImage removeImageNameFromCache:@"imageName"]; -
@Rajneesh071 很好的答案,但似乎
UIImage在调用imageNamed:方法时使用的缓存是内存缓存,而不是文件磁盘缓存(因为它没有任何意义,因为来自imageNamed:的图像已经是应用程序包中的一个文件,与使用imageWithData:和其他类似方法加载的图像不同)。因此_flushSharedImageCache清除了缓存中图像使用的分配内存,从而减少了重内存使用应用程序中的内存警告数量(当我问这个问题时,这最初是我的意图)。但无论如何 tks ;)
标签: objective-c ios caching uiimage