iOS Developer

正确使用NSCache

2016-12-16  本文已影响0人  小白文_Vincent
文艺求关注.png

@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
上一篇下一篇

猜你喜欢

热点阅读