iOS NSCache 用法

来源:互联网 发布:淘宝运营总监职责 编辑:程序博客网 时间:2024/06/05 20:54

NSCache简介:

NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存。

NSCache在系统内存很低时,会自动释放一些对象(出自苹果官方文档,不过在模拟器中模拟内存警告时,不会做缓存的清理动作) 为了确保接收到内存警告时能够真正释放内存,最好调用一下removeAllObjects方法。

NScache是线程安全的,在多线程操作中,不需要对Cache加锁。

NScache的key只是做强引用,不需要实现NScopying协议。


NSCache的属性:

 delegate代理属性

totalCostLimit :缓存空间的最大成本,超出上限会自动回收对象。默认值是0没有限制。

countLimit:能够缓存对象的最大数量,默认值也是0(默认没有限制)。

(当超出缓存最大成本或数量时,NSCache会把前面的数据即最开始存的给清除掉)

evictsObjectsWithDiscardedContent:标示是否回收废弃的内容,默认值是YES(自动回收)。


NSCache的方法:

-objectForKey:返回与键值关联的对象。

-setObject: forKey: 在缓存中设置指定键名对应的值。与可变字典不同的是,缓存对象不会对键名做copy操作 0成本

-setObject: forKey: cost: 在缓存中设置指定键名对应的值,并且指定该键值对的成本。成本cost用于计算记录在缓冲中所有对象的总成本。当出现内存警告,或者超出缓存的成本上限时,缓存会开启一个回收过程,删除部分元素。

-removeObjectForKey:删除缓存中指定键名的对象。

-removeAllObjects:删除缓存中的所有对象。


delegate方法:

-cache: willEvictObject: 缓存将要删除对象时调用,不能在此方法中修改缓存。仅仅用于后台的打印,以便于程序员的测试。

代码演练

需要实现NSCacheDelegate

@interface ViewController () <NSCacheDelegate>

实现代理方法:

// MARK: NSCache Delegate// 当缓存中的对象被清除的时候,会自动调用// obj 就是要被清理的对象// 提示:不建议平时开发时重写!仅供调试使用- (void)cache:(NSCache *)cache willEvictObject:(id)obj {    [NSThread sleepForTimeInterval:0.5];    NSLog(@"清除了-------> %@", obj);}

声明NSCache变量:

@property (nonatomic, strong) NSCache *cache;

懒加载:

- (NSCache *)cache {    if (_cache == nil) {        _cache = [[NSCache alloc] init];        // 设置数量限制,最大限制为10        _cache.countLimit = 10;        _cache.delegate = self;    }    return _cache;}

测试Demo:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    for (int i = 0; i < 20; ++i) {        NSString *str = [NSString stringWithFormat:@"hello - %04d", i];        NSLog(@"设置 %@", str);        // 添加到缓存        [self.cache setObject:str forKey:@(i)];    }    // - 查看缓存内容,NSCache 没有提供遍历的方法,只支持用 key 来取值    for (int i = 0; i < 20; ++i) {        NSLog(@"缓存中----->%@", [self.cache objectForKey:@(i)]);    }}

运行结果:

2015-03-25 09:27:19.953 01-NSCache演练[26010:681046] 设置 hello - 00002015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00012015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00022015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00032015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00042015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00052015-03-25 09:27:19.954 01-NSCache演练[26010:681046] 设置 hello - 00062015-03-25 09:27:19.955 01-NSCache演练[26010:681046] 设置 hello - 00072015-03-25 09:27:19.955 01-NSCache演练[26010:681046] 设置 hello - 00082015-03-25 09:27:19.955 01-NSCache演练[26010:681046] 设置 hello - 00092015-03-25 09:27:19.955 01-NSCache演练[26010:681046] 设置 hello - 00102015-03-25 09:27:20.456 01-NSCache演练[26010:681046] 清除了-------> hello - 00002015-03-25 09:27:20.457 01-NSCache演练[26010:681046] 设置 hello - 00112015-03-25 09:27:20.957 01-NSCache演练[26010:681046] 清除了-------> hello - 00012015-03-25 09:27:20.957 01-NSCache演练[26010:681046] 设置 hello - 00122015-03-25 09:27:21.458 01-NSCache演练[26010:681046] 清除了-------> hello - 00022015-03-25 09:27:21.459 01-NSCache演练[26010:681046] 设置 hello - 00132015-03-25 09:27:21.959 01-NSCache演练[26010:681046] 清除了-------> hello - 00032015-03-25 09:27:21.959 01-NSCache演练[26010:681046] 设置 hello - 00142015-03-25 09:27:22.461 01-NSCache演练[26010:681046] 清除了-------> hello - 00042015-03-25 09:27:22.461 01-NSCache演练[26010:681046] 设置 hello - 00152015-03-25 09:27:22.962 01-NSCache演练[26010:681046] 清除了-------> hello - 00052015-03-25 09:27:22.962 01-NSCache演练[26010:681046] 设置 hello - 00162015-03-25 09:27:23.464 01-NSCache演练[26010:681046] 清除了-------> hello - 00062015-03-25 09:27:23.464 01-NSCache演练[26010:681046] 设置 hello - 00172015-03-25 09:27:23.965 01-NSCache演练[26010:681046] 清除了-------> hello - 00072015-03-25 09:27:23.965 01-NSCache演练[26010:681046] 设置 hello - 00182015-03-25 09:27:24.466 01-NSCache演练[26010:681046] 清除了-------> hello - 00082015-03-25 09:27:24.466 01-NSCache演练[26010:681046] 设置 hello - 00192015-03-25 09:27:24.967 01-NSCache演练[26010:681046] 清除了-------> hello - 00092015-03-25 09:27:24.967 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.967 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.968 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.968 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.968 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.968 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.969 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.969 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.969 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.969 01-NSCache演练[26010:681046] 缓存中----->(null)2015-03-25 09:27:24.969 01-NSCache演练[26010:681046] 缓存中----->hello - 00102015-03-25 09:27:24.970 01-NSCache演练[26010:681046] 缓存中----->hello - 00112015-03-25 09:27:24.970 01-NSCache演练[26010:681046] 缓存中----->hello - 00122015-03-25 09:27:24.970 01-NSCache演练[26010:681046] 缓存中----->hello - 00132015-03-25 09:27:24.970 01-NSCache演练[26010:681046] 缓存中----->hello - 00142015-03-25 09:27:24.971 01-NSCache演练[26010:681046] 缓存中----->hello - 00152015-03-25 09:27:24.971 01-NSCache演练[26010:681046] 缓存中----->hello - 00162015-03-25 09:27:24.971 01-NSCache演练[26010:681046] 缓存中----->hello - 00172015-03-25 09:27:24.971 01-NSCache演练[26010:681046] 缓存中----->hello - 00182015-03-25 09:27:24.971 01-NSCache演练[26010:681046] 缓存中----->hello - 0019
总结

通过打印结果可以知道,当超多最大成本限制的时候,会先清除缓存中的一条数据,再存入一条新的数据。最后缓存中只能保存最大成本数的数据,即10条。


0 0