Ios 当应用程序进入后台时,NSCache总是逐出图像数据

Ios 当应用程序进入后台时,NSCache总是逐出图像数据,ios,nscache,Ios,Nscache,这可能是预期的行为,但苹果并未明确说明 我正在使用NSCache为我的UICollectionView缓存一些图像。当我将应用程序放在后台并再次(立即)打开它时,我的所有图像都不再位于NSCache中 理想情况下,我希望最近加载的图像保持缓存状态,这样当用户重新打开应用程序时,他们就不必再次支付加载所有图像的费用。似乎NSCache应该允许一个不太激进的缓存策略 我只是想在这里发个帖子,做个精神检查,确保我没有遗漏任何明显的东西 否则,我将不得不实现自己的缓存,将最后25个加载的图像保存在NSM

这可能是预期的行为,但苹果并未明确说明

我正在使用
NSCache
为我的
UICollectionView
缓存一些图像。当我将应用程序放在后台并再次(立即)打开它时,我的所有图像都不再位于
NSCache

理想情况下,我希望最近加载的图像保持缓存状态,这样当用户重新打开应用程序时,他们就不必再次支付加载所有图像的费用。似乎
NSCache
应该允许一个不太激进的缓存策略

我只是想在这里发个帖子,做个精神检查,确保我没有遗漏任何明显的东西

否则,我将不得不实现自己的缓存,将最后25个加载的图像保存在
NSMutableDictionary
缓存中。

苹果文档说:

NSCache类包含各种自动删除策略,这些策略 确保它不会占用过多的系统内存。这个 如果用户需要内存,系统将自动执行这些策略 其他应用程序。调用时,这些策略将删除某些项 从缓存中删除,最大限度地减少其内存占用

因此,它会删除一些项目,而不是所有项目。它取决于NSCache内部策略、可用内存、设备状态等。此外,还需要阅读一点NSDiscardableContent协议

从文档中:

默认情况下,缓存中的NSDiscardableContent对象是 如果其内容被丢弃,则会自动从缓存中删除, 尽管此自动删除策略可以更改。如果 NSDiscardableContent对象被放入缓存,缓存调用 如果可能的话,在其移除时丢弃


看起来您需要为放入NSCache中的对象实现NSDiscardableContent协议。当缓存中的对象不符合NSDiscardableContent时,根据此答案,它们将在应用程序后台退出

我也遇到了同样的问题,“当应用程序进入后台时,NSCache中的缓存图像被逐出”。我确实创建了一个例子来处理这个问题,可以在github中找到

这里不需要导入,UIImage不会直接缓存到NSCache中。这被包装到CacheItem泛型类中,该类确认NSDiscardableContent,其中isContentDiscarded返回false,beginContentAccess返回true


更多关于NSDiscardableContent的信息

我对它进行了测试,将一些图像放入缓存,将应用程序放在后台,并将其放回前台,这些图像似乎已被逐出。从AFNetworking的setImageWithURLRequest接收图像后,我正在缓存这些图像。我想知道这是否与此有关?当应用程序进入后台时,可能还有其他东西在释放图像?我同意,这也是文档中提到的。您可能希望使用一些会话变量(如singleton类)并进行设置。谢谢-我将尝试更多并向您报告。我也有同样的。。所以我使用了NSDiscardableContent,当应用程序进入后台时,我不会从NSCache中删除缓存的图像。我创建的示例应用程序CacheItem是geneic类,确认了NSDiscardableContent。此类的主要目标是在存储属性中包装项