究竟什么时候从 urlcache 的内存和磁盘中删除内容?

Hon*_*ney 6 memory caching disk nsurlcache ios

let memoryCapacity = 200 * 1024 * 1024
let diskCapacity = 1 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache
Run Code Online (Sandbox Code Playgroud)

场景1

我将 urlcache 的内存设置为 200mb,并将磁盘空间设置为 1mb。然后我下载一张图片。关闭互联网并强制退出应用程序,通过点击再次启动应用程序,并触发调用(下载图像),但它立即崩溃,data因为nil

不用说,如果我关闭互联网,它仍然会按预期从缓存中读取,并且不会发生崩溃。

场景2

如果我将 diskCapacity 设置为 200mb ( let diskCapacity = 200 * 1024 * 1024),那么即使缓存被刷新出内存,图像仍然保留在磁盘中;它会永远显示!


根据这一观察,我有以下问题:

  • 是否正确地说,每次您强制退出或您的应用程序由于内存警告/问题而崩溃时,您的缓存都会被刷新,尽管它使您的磁盘完好无损?
  • 还有其他原因导致缓存被刷新出内存吗?
  • 磁盘中存储的内容什么时候可以删除?

Rob*_*Rob 3

简短回答:

当应用程序终止时(或者也可能在内存压力下),内存缓存会丢失。磁盘缓存在应用程序的多次调用中仍然存在,但如果设备耗尽持久存储并且操作系统从缓存和临时文件夹中回收空间,则可以删除磁盘缓存。


长答案:

你问:

是否正确地说,每次您强制退出或您的应用程序由于内存警告/问题而崩溃时,您的缓存都会被刷新,尽管它使您的磁盘完好无损?

大部分。更准确地说,当应用程序终止时,与应用程序相关的所有内存都将被丢弃,并且当应用程序重新启动时,只能检索那些保存到持久存储的项目。

还有其他地方可以清除缓存吗?

当应用程序终止时,您会丢失内存缓存中的所有内容。显然还有其他一些情况可以删除项目:

  • 如果您手动从URLCache.
  • 当您接近缓存的最大容量并尝试添加新项目时,较旧的单个项目将从缓存中删除,从而强制淘汰较旧的项目。
  • 网络响应通常包含缓存策略(指示可以安全缓存响应多长时间),因此它们很可能会在此时被删除。
  • 内存高速缓存可以在内存压力时合理地被清除(例如.UIApplicationDidReceiveMemoryWarning)。

磁盘中存储的内容什么时候可以删除?

逻辑与之前的观点基本相同,除了(a)它可以在应用程序的调用中生存);(b) 它不会在内存压力时刷新,尽管当设备持久存储空间不足时可以将其删除。