您的位置:首页 > 移动开发 > IOS开发

iOS 【原生API 缓存类NSCache】

2015-12-08 19:02 330 查看
//
//  ViewController.m
//  0712-03NSCache的使用-01
//
//  Created by 王中尧 on 16/7/12.
//  Copyright © 2016年 wzy. All rights reserved.
//

/*

 NSCache 和 NSMutableDictionary 很像,是苹果官方提供的缓存类,在AFN和SDWebImage框架中被使用来管理缓存

① 根据一个key值存储数据
② 可以设置 每个存入数据的成本 和 最大成本
超出成本就会回收(先存入的数据会先被回收)
③ delegate方法:开启回收过程的时候调用(这个代理方法一般调试的时候使用)
④ 缓存最大成本(最大缓存的成本)   缓存总数量(最大缓存的数量)
超出就会被清空回收
取数据时就会取满足数量的最新添加的数据
两个属性同时设置,则谁更小,满足谁(二者设置冲突取小者)
⑤ NSCache可以去替换NSDictionary,在多图下载综合案例中,二级缓存中 内存缓存 的部分可以用NSCache去定义一个属性存储。(就不用NSDictionary去保存内存缓存了
⑥ NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
⑦ NSCache的Key只是对对象进行Strong引用,不是拷贝,在清理的时候计算的是实际大小而不是引用的大小

*/

#import "ViewController.h"

@interface ViewController () <NSCacheDelegate>

@property (nonatomic, strong) NSCache *cache;

@end

@implementation ViewController

- (NSCache *)cache {
if (!_cache) {
NSCache *cache = [[NSCache alloc] init];
cache.delegate = self;

// 设置缓存的总数量,如果超过了 缓存的总数量 那么该对象内部会开启一个回收过程(先把之前的对象删除,存储后面的数据)
cache.countLimit = 5;

// 设置缓存的总成本,如果超过了 缓存的总成本 那么该对象内部会开启一个回收过程(先把之前的对象删除,存储后面的数据)
cache.totalCostLimit = 4;

_cache = cache;
}
return _cache;
}

- (IBAction)setData:(id)sender {
for (int i = 0; i < 15; i ++) {
NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangzhongyao/Desktop/打印 知识点.doc"];
[self.cache setObject:data forKey:@(i) cost:1]; // 往cache中写入值,cost为单位成本(相对于 总成本 和 总数量 而言的)
NSLog(@"保存第%d个数据", i);
}
NSLog(@"set************");
}

- (IBAction)getData:(id)sender {
for (int i = 0; i < 15; i ++) {
NSData *data = [self.cache objectForKey:@(i)];
if (data) {
NSLog(@"取出第%d个数据", i);
}
}
NSLog(@"get-------------");
}

#pragma mark - NSCacheDelegate (NSCache只有这么一个delegate方法)
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
NSLog(@"---开启回收机制时调用---");
}

@end

*/


/*
2016-07-12 20:51:18.828 0712-03NSCache的使用-01[9038:880483] 保存第0个数据
2016-07-12 20:51:18.829 0712-03NSCache的使用-01[9038:880483] 保存第1个数据
2016-07-12 20:51:18.830 0712-03NSCache的使用-01[9038:880483] 保存第2个数据
2016-07-12 20:51:18.831 0712-03NSCache的使用-01[9038:880483] 保存第3个数据
2016-07-12 20:51:18.833 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.833 0712-03NSCache的使用-01[9038:880483] 保存第4个数据
2016-07-12 20:51:18.835 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.835 0712-03NSCache的使用-01[9038:880483] 保存第5个数据
2016-07-12 20:51:18.835 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.836 0712-03NSCache的使用-01[9038:880483] 保存第6个数据
2016-07-12 20:51:18.836 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.836 0712-03NSCache的使用-01[9038:880483] 保存第7个数据
2016-07-12 20:51:18.837 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.837 0712-03NSCache的使用-01[9038:880483] 保存第8个数据
2016-07-12 20:51:18.837 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.837 0712-03NSCache的使用-01[9038:880483] 保存第9个数据
2016-07-12 20:51:18.838 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.838 0712-03NSCache的使用-01[9038:880483] 保存第10个数据
2016-07-12 20:51:18.838 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.839 0712-03NSCache的使用-01[9038:880483] 保存第11个数据
2016-07-12 20:51:18.839 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.839 0712-03NSCache的使用-01[9038:880483] 保存第12个数据
2016-07-12 20:51:18.840 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.840 0712-03NSCache的使用-01[9038:880483] 保存第13个数据
2016-07-12 20:51:18.840 0712-03NSCache的使用-01[9038:880483] ---开启回收机制时调用---
2016-07-12 20:51:18.841 0712-03NSCache的使用-01[9038:880483] 保存第14个数据
2016-07-12 20:51:18.841 0712-03NSCache的使用-01[9038:880483] set************
2016-07-12 20:51:22.109 0712-03NSCache的使用-01[9038:880483] 取出第11个数据
2016-07-12 20:51:22.109 0712-03NSCache的使用-01[9038:880483] 取出第12个数据
2016-07-12 20:51:22.110 0712-03NSCache的使用-01[9038:880483] 取出第13个数据
2016-07-12 20:51:22.110 0712-03NSCache的使用-01[9038:880483] 取出第14个数据
2016-07-12 20:51:22.110 0712-03NSCache的使用-01[9038:880483] get-------------
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NSCache 缓存类