01.NSCache是专门用来进行缓存处理的,
02.NSCache简单介绍:
2-1 NSCache是苹果官方提供的缓存类,具体使用和NSDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存
2-2 苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
建议:接收到内存警告时主动调用removeAllObject方法释放对象
2-3 NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
2-4 NSCache的Key只是对对象进行Strong引用,不是拷贝
03 属性介绍:
name:名称
delegete:设置代理
totalCostLimit:缓存空间的最大总成本,超出上限会自动回收对象。默认值为0,表示没有限制
countLimit:能够缓存的对象的最大数量。默认值为0,表示没有限制
evictsObjectsWithDiscardedContent:标识缓存是否回收废弃的内容
04 方法介绍
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
- (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
- (void)removeAllObjects;//删除缓存中所有的对象
1 #import "ViewController.h" 2 3 @interface ViewController ()<NSCacheDelegate> 4 /** 注释 */ 5 @property (nonatomic, strong) NSCache *cache; 6 @end 7 8 @implementation ViewController 9 10 -(NSCache *)cache 11 { 12 if (_cache == nil) { 13 _cache = [[NSCache alloc]init]; 14 _cache.totalCostLimit = 5;//总成本数是5 ,如果发现存的数据超过中成本那么会自动回收之前的对象 15 _cache.delegate = self; 16 } 17 return _cache; 18 } 19 20 //存数据 21 - (IBAction)addBtnClick:(id)sender 22 { 23 //NSCache的Key只是对对象进行Strong引用,不是拷贝(和可变字典的区别) 24 for (NSInteger i = 0; i<10; i++) { 25 NSData *data = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20160221_38.png"]; 26 27 //cost:成本 28 [self.cache setObject:data forKey:@(i) cost:1]; 29 NSLog(@"存数据%zd",i); 30 } 31 } 32 33 //取数据 34 - (IBAction)checkBtnClick:(id)sender 35 { 36 NSLog(@"+++++++++++++++"); 37 for (NSInteger i = 0; i<10; i++) { 38 NSData *data = [self.cache objectForKey:@(i)]; 39 if (data) { 40 NSLog(@"取出数据%zd",i); 41 } 42 } 43 } 44 45 //删除数据 46 - (IBAction)removeBtnClick:(id)sender 47 { 48 [self.cache removeAllObjects]; 49 } 50 51 #pragma mark ---------------------- 52 #pragma mark NSCacheDelegate 53 //即将回收对象的时候调用该方法 54 -(void)cache:(NSCache *)cache willEvictObject:(id)obj 55 { 56 NSLog(@"回收%zd",[obj length]); 57 } 58 @end
浙公网安备 33010602011771号