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

时间:2017-09-08 15:52:22

标签: ios caching memory disk nsurlcache

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。然后我下载一张图片。关闭互联网并强制退出应用程序,通过点击它再次启动应用程序,然后触发呼叫(下载图像),但它立即崩溃,因为datanil

毋庸置疑,如果我关闭互联网,它仍会按预期从缓存中读取,不会发生崩溃。

Scenario2

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

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

  • 这是正确的说,每次你强行退出或你的应用程序因内存警告/问题而崩溃时你的缓存都会被刷新,虽然它会让你的磁盘保持原样吗?
  • 缓存可以从内存中刷新的任何其他原因吗?
  • 何时可以删除存储在磁盘中的内容?

1 个答案:

答案 0 :(得分:1)

简短回答:

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

答案很长:

你问:

  

这是正确的说,每次你强行退出或你的应用程序因内存警告/问题而崩溃时你的缓存都会被刷新,虽然它会让你的磁盘保持原样吗?

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

  

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

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

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

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

逻辑与前一点大致相同,只是(a)它可以在应用程序的调用中存活下来; (b)它没有因内存压力而被刷新,但是当设备在持久存储上运行不足时可以将其删除。