NSCache:专门做缓存的类
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:删除缓存中的所有对象。
委托方法:
-cache: willEvictObject: 缓存将要删除对象时调用,不能在此方法中修改缓存。仅仅用于后台的打印,以便于程序员的测试。
举例验证如下:
-
-
-
-
-
-
-
-
- #import "ViewController.h"
-
- @interface ViewController ()<NSCacheDelegate>
-
-
- @property (nonatomic, strong) NSCache *myCache;
- @end
-
- @implementation ViewController
- -(NSCache *)myCache
- {
- if (_myCache == nil) {
- _myCache = [[NSCache alloc] init];
-
-
-
-
-
-
-
-
-
-
- _myCache.countLimit = 30;
- _myCache.delegate = self;
- }
- return _myCache;
- }
-
- -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- {
- for (int i =0 ; i< 100; i++) {
-
- NSString *str = [NSString stringWithFormat:@"hello - %d", i];
- [self.myCache setObject:str forKey:@(i)];
- }
- for (int i=0 ; i< 100; i++) {
- NSLog(@"%@", [self.myCache objectForKey:@(i)]);
- }
- }
-
-
-
-
- -(void)cache:(NSCache *)cache willEvictObject:(id)obj
- {
-
- NSLog(@"要删除的对象obj-------------%@", obj);
- }
- @end
没有设置代理时的运行结果如下:
因为限额最大数量是30,所以NSCache把前面的0~69的对象全部删除清理了。
遵循代理方法后,打印结果如下:
发现此代理方法就是在清理缓存对象之前告知程序员,便于调试而已。
所以在原来的工程中做缓存池的可变字典都可以用NScache进行替代了。代码如下:
CZApp.h
-
-
-
-
-
-
-
-
- #import <UIKit/UIKit.h>
-
- @interface CZApp : NSObject
- @property(nonatomic, copy) NSString *name;
- @property (nonatomic, copy) NSString *icon;
- @property (nonatomic, strong) NSString *download;
-
-
-
-
-
-
- +(instancetype) appWithDict:(NSDictionary *) dict;
- @end
CZApp.m
-
-
-
-
-
-
-
-
- #import "CZApp.h"
-
- @implementation CZApp
- +(instancetype) appWithDict:(NSDictionary *) dict
- {
- CZApp *app = [[self alloc] init];
- [app setValuesForKeysWithDictionary:dict];
- return app;
- }
- @end
viewController.m