正确使用NSCache
2016-12-16 本文已影响0人
小白文_Vincent
文艺求关注.png
- <h5>NSCache</h5>
- NSCache是专门用来进行缓存处理的
- <h5>NSCache简单介绍</h5>
- 1-1.NSCache是苹果官方提供的缓存类,具体使用和NSDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存
- 1-2.苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
- 建议:接收到内存警告时主动调用removeAllObject方法释放对象
- 1-3.NSCache是线程安全的,在多线程操作中,不需要对NSCache进行加锁
- 1-4.NSCache的Key只是对对象进行Strong引用,不是copy
- <h5>补充--iOS开发中的- 磁盘缓存</h5>
- Documents:连接iTunes,做自动备份的,苹果官方规定,不允许将缓存内容放在此目录下
- Library:
- Caches:专门用来处理缓存的,
- Preferences:偏好设置,用来保存一些账号信息 - tmp:临时存储
- <h5>NSCache基本使用</h5>
@property (nonatomic, strong) NSCache *cache;
- (NSCache *)cache {
if (_cache == nil) {
_cache = [[NSCache alloc] init];
_cache.totalCostLimit = 5; //总成本数为5,如果发现存的数据超过总成本那么会自动回收之前的对象, ! ! 与下面cost配合使用
_cache.delegate = self; //开发中一般用不到,一般用于测试
// _cache.countLimit = 5; //设置最多可以缓存多少个数据,
}
return _cache;
}
// 在storyboard中拉三个按钮,分别修改修改名称为:添加数据、检查缓存、清理缓存,并拖线
// 添加数据
- (IBAction)addDataBtnClick:(id)sender {
// NSCache的Key只是对对象进行Strong引用,不是copy
// imageData放在外面,data是同一个对象,即一个对象加了10个强引用,他的总成本为1,不会回收处理
// NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/Vincent/Desktop/互斥锁.png"];
for (NSInteger i = 0; i < 10; i++) {
// imageData放for循环里面,创建了10个对象,他的总成本为10,会进行回收处理
NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/Vincent/Desktop/互斥锁.png"];
[self.cache setObject:imageData forKey:@(i) cost:2]; //与字典用法类似 //cost 与 totalCostLimit 配对使用,
NSLog(@"存数据%zd", i);
}
}
// 检查数据
- (IBAction)chectDataBtnClick:(id)sender {
NSLog(@"++++++++++++++++++++++++++++++++");
for (NSInteger i = 0; i < 10; i++) {
NSData *data = [self.cache objectForKey:@(i)];
if (data) {
NSLog(@"取出数据%zd", i );
}
}
}
// 删除数据
- (IBAction)removeDataBtnClick:(id)sender {
[self.cache removeAllObjects];
}
#pragma - NSCache代理方法
// 即将要回收对象的时候,调用该代理方法
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
NSLog(@"即将回收%zd", [obj length]);
}
关注一下又不会怀孕.png