(
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