第03天多线程网络:(10):NSCache简单介绍

原创
2017/04/24 14:32
阅读数 4

#####一、NSCache简单介绍

补充笔记

1.SDWebImage相关知识点补充
  01.SDWebImage接收到内存警告的时候如何处理?采用监听系统警告通知的方式处理,接收到警告后清空缓存
  02.SDWebImage队列最大并发数为6
  03.SDWebImage内部设置下载图片超时时间为15m
  04.SDWebImage图片下载操作使用了NSURLConnection类发送网络请求实现
  05.SDWebImage内部使用NSCache类来进行缓存处理
  06.SDWebImage内部如何判断图片类型?判断该图片二进制数据的第一个字节
  07.SDWebImage做沙盒缓存时图片的命名机制是拿到图片的URL后直接对URL进行MD5加密

2.NSCache知识点补充
 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;//删除缓存中所有的对象



code

#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; // 总成本数是5 , 如果发现存的数据超过总成本,那么会自定回收之前的对象
        _cache.delegate = self;
        
    }
    return _cache;
}
#pragma mark NSCache 的delegate
// 即将要回收成本的代理
- (void)cache:(NSCache *)cache willEvictObject:(id)obj
{
    NSLog(@"回收 %zd",[obj length]);
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
}

#pragma mark 添加数据
- (IBAction)addClick:(id)sender {
    
    // 放到外面 内存地址是一样的 所有存储也是1个,只不过引用是了十次 检查的时候不会是检查引用了多少次 而是看总成本
    //NSCache的key只是对对象进行strong引用,不会拷贝 ( 不会回收对象)
    NSData *data = [NSData dataWithContentsOfFile:@"/Users/liyuhong165/Desktop/ed020d8bf0b0630c00e84c874f5a3f44.jpg"];

    for (NSInteger i = 0; i<10; i++) {
//        NSData *data = [NSData dataWithContentsOfFile:@"/Users/liyuhong165/Desktop/ed020d8bf0b0630c00e84c874f5a3f44.jpg"]; // 会回收对象 (每次data都是一个新的值)
//        [self.cache setObject:data forKey:@(i)];
        [self.cache setObject:data forKey:@(i) cost:1]; // 设置为一个成本 (cost)
        NSLog(@"存数据%zd",i);
    }
}

#pragma mark 检查数据
- (IBAction)checkClick:(id)sender {
    NSLog(@"++++++++++++");
    for (NSInteger i = 0; i<10; i++) {
        NSData *data = [self.cache objectForKey:@(i)];
        if (data) {
            NSLog(@"取出数据%zd",i);
        }
    }
}
#pragma mark 删除数据
- (IBAction)removeClick:(id)sender {
    [self.cache removeAllObjects];
}


@end
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部