【问题标题】:How to delete all cache in NSCache?如何删除 NSCache 中的所有缓存?
【发布时间】:2019-08-26 11:00:49
【问题描述】:

我正在使用NSCache 来缓存对象。有没有办法一次删除所有缓存?

我正在使用以下方法进行缓存:

class VC: UIViewController {
    static let userCache = NSCache<NSString, User>()

    func getUser(fromId id: String, completion: @escaping (_ user: User) -> Void) {
        if let cachedVersion = VC.userCache.object(forKey: id as NSString) {
            print("using cached user from id")
            completion(cachedVersion)
            return
        }

        // retrieve new instance of object
    }
}

但我看到文档和数据部分随着时间的推移而增加(目前为 140MB+)。我尝试使用以下方法清除缓存,但没有成功:

VC.userCache.removeAllObjects()

有没有办法检索NSCache 的旧实例,这样我就不必在每次加载应用程序时都创建一个新实例?或者有没有办法在应用加载时删除所有缓存的对象?

【问题讨论】:

    标签: ios swift caching nscache


    【解决方案1】:

    removeAllObjects() 不起作用是什么意思?你确定你使用的内存来自这个缓存吗?如果缓存被多个 ViewControllers 使用,您应该在这些 ViewControllers 之外创建和管理它,这样您就不会创建多个实例,例如CacheManager 类或类似的东西。

    您还可以在缓存中设置countLimittotalCostLimit 属性,使其大小不会膨胀。

    【讨论】:

    • removeAllObjects() 未在创建新实例时清除旧实例的缓存。内存不一样,这就是我的观点 - 我需要访问以前的 NSCache 实例才能删除它们。
    • 对,我是说你不应该有多个缓存实例。您需要引用这些 NSCache 对象才能将它们取回。创建多个 NSCache 对象然后丢失它们会导致内存泄漏,这就是您所看到的。您应该创建一个 CacheManager 类(或类似的东西)并以这种方式管理它。
    • 我创建的唯一实例是在应用程序的初始加载;但是有没有办法将这些实例“保存”到磁盘上,然后在应用程序再次打开时重新使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2016-08-18
    • 2020-03-28
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多