如何使用 NSCache

Posted

技术标签:

【中文标题】如何使用 NSCache【英文标题】:How to use NSCache 【发布时间】:2011-08-10 23:38:28 【问题描述】:

有人可以举例说明如何使用NSCache 缓存字符串吗? 或者任何人都有一个很好的解释的链接?好像没找到啊。。

【问题讨论】:

尽管看到了大量的 Cocoa,但我从未听说过 NSCache。好问题! 我在这里创建了一个可迭代的 NSCache 版本。随意贡献:github.com/gregkrsak/GKCache 【参考方案1】:

您使用它的方式与使用 NSMutableDictionary 的方式相同。不同之处在于,当NSCache 检测到内存压力过大(即它缓存了太多值)时,它会释放其中一些值以腾出空间。

如果您可以在运行时重新创建这些值(通过从 Internet 下载、进行计算等),那么 NSCache 可能会满足您的需求。如果无法重新创建数据(例如,它是用户输入、时间敏感等),则不应将其存储在 NSCache 中,因为它将在那里被销毁。

例如,不考虑线程安全:

// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");

// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) 
    // It's not in the cache yet, or has been removed. We have to
    // create it. Presumably, creation is an expensive operation,
    // which is why we cache the results. If creation is cheap, we
    // probably don't need to bother caching it. That's a design
    // decision you'll have to make yourself.
    myWidget = [[[Widget alloc] initExpensively] autorelease];

    // Put it in the cache. It will stay there as long as the OS
    // has room for it. It may be removed at any time, however,
    // at which point we'll have to create it again on next use.
    [myCache setObject: myWidget forKey: @"Important Widget"];


// myWidget should exist now either way. Use it here.
if (myWidget) 
    [myWidget runOrWhatever];

【讨论】:

如何实例化 NSCache 对象?每次运行应用程序时,我似乎都会丢失所有缓存的信息。我用; [[NSCache alloc] 初始化] 它不是磁盘上的永久缓存。它只在内存中,所以是的,每次你的应用停止运行时它都会被销毁。 应用程序进入后台后是否维护这个缓存? (即applicationDidEnterBackground之后) 如果应用程序没有终止并且NSCache 对象没有被释放,那么是的,它将保留在内存中。但是,它的内容可能仍会被剔除。 没有。断言断言某事是真实的,即内部的陈述被期望是真实的。我们断言对象分配和/或创建是成功的。【参考方案2】:
@implementation ViewController
    
    NSCache *imagesCache;    



- (void)viewDidLoad
    
    imagesCache = [[NSCache alloc] init];



// How to save and retrieve NSData into NSCache
NSData *imageData = [imagesCache objectForKey:@"KEY"];
[imagesCache setObject:imageData forKey:@"KEY"];

【讨论】:

是的。保存:[imagesDictionary setObject:imageData forKey:@"KEY"];检索:NSData *imageData = [imagesCache objectForKey:@"KEY"]; 保存数据到缓存:[imagesCache setObject:imageData forKey:@"KEY"]; 我刚刚编辑了更改的帖子:imagesDictionary for imagesCache。谢谢 一个等效的 swift 示例?【参考方案3】:

在 Swift 中使用 NSCache 缓存字符串的示例代码:

var cache = NSCache()
cache.setObject("String for key 1", forKey: "Key1")
var result = cache.objectForKey("Key1") as String
println(result) // Prints "String for key 1"

要创建单个应用程序范围的 NSCache 实例(单例),您可以轻松扩展 NSCache 以添加 sharedInstance 属性。只需将以下代码放在一个名为 NSCache+Singleton.swift 之类的文件中:

import Foundation

extension NSCache 
    class var sharedInstance : NSCache 
        struct Static 
            static let instance : NSCache = NSCache()
        
        return Static.instance
    

然后您可以在应用程序的任何位置使用缓存:

NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"

【讨论】:

你知道如何在 swift 3 中实现这个吗? 这应该可以工作:class Cache: NSCache<AnyObject, AnyObject> static let shared = NSCache<AnyObject, AnyObject>() private override init() super.init() 【参考方案4】:

sample Project 将示例项目中的 CacheController.h 和 .m 文件添加到您的项目中。在要缓存数据的类中,输入以下代码。

[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];

你可以使用 this 设置任何对象

[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];

检索

重要提示:NSCache 类包含各种自动删除策略。如果你想永久缓存数据或者你想在特定时间删除缓存数据see this answer。

【讨论】:

【参考方案5】:

缓存的对象不应该实现 NSDiscardableContent 协议吗?

来自 NSCache 类参考: 存储在 NSCache 对象中的常见数据类型是实现 NSDiscardableContent 协议的对象。将这种类型的对象存储在缓存中是有好处的,因为它的内容可以在不再需要时丢弃,从而节省内存。默认情况下,如果缓存中的 NSDiscardableContent 对象的内容被丢弃,则会自动从缓存中删除,尽管可以更改此自动删除策略。如果一个 NSDiscardableContent 对象被放入缓存,缓存会在它被移除时调用discardContentIfPossible。

【讨论】:

您可以实现 NSDiscardableContent 协议,但这不是必需的。当没有更多引用时,似乎 NSDiscardableContent 总是从 NSCache 中删除。 NSDiscardableContent 对象以外的对象都存储在 NSCache 中,直到出现“内存紧张”并且 NSCache 将被清除。

以上是关于如何使用 NSCache的主要内容,如果未能解决你的问题,请参考以下文章

NSCache使用常见错误

NSCache的简单使用

NSCache

iOS开发-NSCache

iOS缓存策略之NSCache的简单使用

NSCache