我想用NSCache保存字符串(或其他任何东西)时遇到问题,尽管我看到了很多教程和复制粘贴的代码。

现在,我最后一次尝试的方法是缓存一个简单的字符串,然后将其检索出来,以进行测试。

let cache = NSCache<NSString, NSString>()
if let cachedObject = cache.object(forKey: "test" as NSString) {
    print("Cached \(cachedObject)")
} else {
    let test = "Testing"
    cache.setObject(test as NSString, forKey: "test" as NSString)
    print("Not cached \(test)")
}


当我看到日志输出时,它总是打印“ Not cached Testing”。就像它从未缓存过任何东西一样。我不知道该如何解决,它困扰了我几天。

提前致谢。

最佳答案

当我看到日志输出时,它总是打印“ Not cached Testing”。就像它从未缓存过任何东西一样。我不知道该如何解决,这让我紧张了几天。


在循环中运行相同的代码。第一次,您会收到“未缓存”消息,因为该对象尚未添加到缓存中。在循环的每个后续时间中,您将被缓存,因为该对象将被添加到缓存中。


  我认为我的问题是,当我重新构建应用程序时,缓存会自行清除。但是,当我重新启动该应用程序时,它在第一行再次说“未缓存”。


是的,这是预期的行为。 Paulw11在上面的评论中正确指出了NSCache不是持久性的。也就是说,缓存中的对象不会写入磁盘。缓存及其内容仅存在于内存中。 NSCache reference page说:

一个可变集合,用于临时存储短暂的键/值对,当资源不足时,这些键/值对会被逐出。

将NSCache视为字典,可以用来存储大型对象(例如图像)而不必担心使用过多的内存。假设您正在写相册,并且希望避免每次需要时从磁盘重新读取照片,但是同时您不能一次将所有照片都存储在内存中使用方式过多的内存。因此,您可以为照片创建一个NSCache实例。从磁盘读取照片之前,可以尝试从缓存中获取照片。如果不存在,则从磁盘读取它,并将其添加到缓存中。另一方面,如果对象位于缓存中,则无需再次读取即可获取它,这会使您的应用程序性能更好。

请勿使用NSCache存储您无法以其他方式重新创建的数据(例如,从磁盘重新读取或重新计算)。并且知道当应用程序退出时,缓存将与内存中的所有其他对象一起消失。

10-08 08:06