iOS - OC NSCache 缓存

前言

  • NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本。用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,都使用它来管理缓存。

    • - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

    • 设置对象并指定 "成本",成本可以自行指定
    • 例子:缓存图片
      • 1、缓存 100 张图片
      • 2、将图片的"宽 * 高"当作成本,图像"像素",10M 当作缓存成本,无论缓存的多少张照片,只要像素值超过 10M,就自动清理缓存图像的时候,使用成本,比单纯设置数量要科学!
  • NSCache 是线程安全的,在多线程操作中,不需要对 Cache 加锁。

  • NSCache 的 Key 只是做强引用,与可变字典不同,缓存对象不会对键名做 copy 操作,不需要实现 NSCopying 协议。

  • 使用 NSCache 做缓存一定要保证能够有恢复的办法,这是能否使用 NSCache 做缓存的一个重要原则。

    • 例如:imageCache 可以使用 NSCache ,而 downloadQueueCache 不能使用!

    • 当超出限制之后,缓存会自动清理!缓存中的任何对象,都有可能被干掉。
    • 如果是图像缓存,内存中没有,会自动从沙盒加载。
    • 如果操作被释放,就没有回复的渠道!
    • 这个是是否使用 NSCache 做缓存的一个重要原则,一定要保证能够有恢复的办法!

  • 千万不要清理 NSCache

    • 一旦调用了 removeAllObjects,就无法给 cache 添加对象。
    • 关于 NSCache 的内存管理,交给他自己就行!

    • SDWebImage 中存在同样的问题,一旦内存警告,清理了内存之后,之后所有的图片都是从沙盒加载的。

1、NSCache 的使用

    // 创建对象
    NSCache *cache = [[NSCache alloc] init];

    // 设置缓存数量限制,默认值是 0,表示没有限制
    cache.countLimit = 10;
    
    // 设置缓存总成本限制,默认值是 0,表示没有限制
    cache.totalCostLimit = 1024 * 1024;
    
    // 设置是否自动清理缓存,默认为 YES,表示自动清理
    cache.evictsObjectsWithDiscardedContent = YES;
    
    // 设置代理
    cache.delegate = self;
    
    // 设置缓存
    /*
        0 成本,与可变字典不同,缓存对象不会对键名做 copy 操作,只是做强引用
    */
    [cache setObject:str forKey:@(i)];
    
    // 设置缓存
    /*
        指定成本
    */
    [cache setObject:str forKey:@(i) cost:1024];
    
    // 查看缓存内容
    /*
        NSCache 没有提供遍历的方法,只支持用 key 来取值,NSCache 的 Key 只是做强引用,不需要实现 NSCopying 协议
    */
    NSString *string = [cache objectForKey:@(i)];
    
    // 删除指定缓存
    [cache removeObjectForKey:@8];
    
    // 删除所有缓存
    /*
        一旦调用了 removeAllObjects,就无法给 cache 添加对象,关于 NSCache 的内存管理,交给他自己就行
    */
    [cache removeAllObjects];
    
    // 缓存协议方法
    /*
        须遵守 <NSCacheDelegate> 协议,obj 就是要被清理的对象
        当缓存中的对象被清除的时候,会自动调用,不建议平时开发时重写!仅供调试使用
    */
    - (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值