(1)NSCache是专门用来进行缓存处理的
1 NSCache时苹果官方提供的缓存类,具体使用和NSDictionary类似,在AFNetworking框架和SDWebImage框架中被用来管理缓存
2 苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
建议:接收到内存警告时主动调用removeAllObject方法释放对象
3 NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
4 NSCache的Key只是对对象进行Strong引用,不是拷贝
(2)属性:name(名称)
delegate(设置代理)
totalCostLimit(缓存空间的最大总成本,超出上限会自动回收对象,默认值为0,表示没有限制)
countLimit(能够缓存的对象的最大数量,默认值为0,表示没有限制)
evictsObjectsWithDiscardContent(标识缓存是否回收废弃的内容)
#import "ViewController.h" @interface ViewController () <NSCacheDelegate> @property (nonatomic, strong) NSCache *cache; @end @implementation ViewController - (NSCache *)cache { if(_cache == nil) { _cache = [[NSCache alloc] init]; //总成本数,如果存入数据超过总成本,会自动回收之前的对象 _cache.totalCostLimit = 5; _cache.delegate = self; } return _cache; } //存入数据 - (IBAction)addBtnClick:(id)sender { //NSData *data = [NSData dataWithContentsOfFile:@"FileName"]; //NSCache的Key只是对对象进行Strong引用,不是拷贝 //如果写在这里,存入的对象是同一个,总成本为1,NSCache不会回收对象 for(NSInteger i = 0; i < 10; i++) { NSData *data = [NSData dataWithContentsOfFile:@“FileName]; //cost:成本 [self.cache setObject:data forKey:@(i) cost:1]; NSLog(@"存入数据%zd", i); } } //取出数据 - (IBAction)checkBtnClick:(id)sender { for(NSInteger i = 0; i < 10; i++) { NSData *data = [self.cache objectForKey:@(i)]; if(data) { NSLog(@"取出数据%zd", i); } } } //删除数据 - (IBAction)removeBtnClick:(id)sender { [self.cache removeAllObjects]; } //代理方法,即将回收对象时调用该方法 - (void)cache:(NSCache *)cache willEvictObject:(id)obj { NSLog(@"回收%zd", [obj length]); } @end