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

let memoryCapacity = 200 * 1024 * 1024 let diskCapacity = 1 * 1024 * 1024 let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath") URLCache.shared = cache 

Scenario1

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

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

Scenario2

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


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

  • 这是正确的说,每次你强行退出或你的应用程序崩溃由于内存警告/问题你的缓存将刷新,虽然它保持磁盘完好无损?
  • 缓存可以刷新内存的任何其他原因?
  • 何时可以删除存储在磁盘中的内容?

简短回答:

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


答案很长:

你问:

这是正确的说,每次你强行退出或你的应用程序崩溃由于内存警告/问题你的缓存将刷新,虽然它保持磁盘完好无损?

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

缓存可以刷新内存的任何其他地方?

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

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

何时可以删除存储在磁盘中的内容?

逻辑与先前的点大致相同,除了(a)它可以在应用程序的调用中存活下来; (b)虽然可以在设备在持久存储器上运行不足时将其移除,但它不会因内存压力而被刷新。