美文网首页iOS Developer
正确使用NSCache

正确使用NSCache

作者: 小白文_Vincent | 来源:发表于2016-12-16 16:57 被阅读0次
    文艺求关注.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

    相关文章

      网友评论

        本文标题:正确使用NSCache

        本文链接:https://www.haomeiwen.com/subject/slynmttx.html