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条。
- iOS NSCache 用法
- NSCache 简单用法
- IOS之NSCache解析
- iOS NSCache使用
- iOS之NSCache介绍
- iOS 【Mutithreading-NSCache】
- ios-NSCache简单介绍
- iOS NSCache内存优化
- 【iOS】利用NSCache提升效率
- iOS---NSCache的简单使用
- NSCache在IOS中的使用
- IOS学习 NSCache 缓存类
- ios之NSCache的使用
- NSCache
- NSCache
- NSCache
- NSCache
- NSCache
- sql for xml path用法
- 【JZOJ4804】【NOIP2016提高A组模拟9.28】成绩调研
- C++数据类型转换
- 网络技术—本地用户和组课堂笔记
- yesgeta
- iOS NSCache 用法
- 获取SVN版本信息更新exe,dll文件的版本信息(C++, C#)
- yesgetb
- ubuntu安装基本的拼音输入法
- yesgetc
- Android 自定义可编辑图文混排EditText
- yesgetd
- 【Mysql】实现中位数计算
- 西安80坐标系转换工具