前言

  • 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 { }

NSCache 缓存的更多相关文章

  1. iOS - OC NSCache 缓存

    前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本.用法与 NSMutableDictio ...

  2. IOS缓存之NSCache缓存

    NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中, ...

  3. iOS NSCache缓存类的了解

    前言:   最近面试时,问到了限定并发数的视频下载,当时回答的时通过GCD_barrier 处理,回来想想也可以通过NSCache处理,所以顺便复习一下,这个知识点. 一,关于NSCache说明 说明 ...

  4. NSCache缓存怎么来的

    什么是NSCache NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据.它有三个特点: • NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略: ...

  5. 第二篇、为UITableViewCell 高度自适应加速 缓存cell的高度

    通过NSCache缓存已经算好的行高 @interface ZHCellHeightCalculator : NSObject //系统计算高度后缓存进cache -(void)setHeight:( ...

  6. 探究react-native 源码的图片缓存

    先看js端图片使用的三种方式,依次排序1.2.3 <Image source={{uri:url}} style={{width:200,height:200}}/> 1. 加载远程图片 ...

  7. 关于UIImageView缓存加载的笔记

    加载图片的两个方法: [UIImage imageNamed:] [[UIImage alloc] initWithContentsOfFile: imgpath] [UIImage imageNam ...

  8. iOS开发中可能有用的那些分类们Categories

    Categories是给你得不到源码的classes增加功能的一种方法. UIImageView+FaceAwareFill 这个类别使用了Aspect Fill内容模式,可以自动根据图像内容进行调整 ...

  9. ObjectiveC 文件操作二

    10,文件委托,以便操作文件.头部看起来像是这样. @interface MyFileManager : NSObject @property(strong)NSFileManager *fileMa ...

随机推荐

  1. oracle 11g r2 rac +openfiler 2.99 +centos 6.5+vbox

    继上篇openfiler 2.99安装之后,这一篇讲介绍openfiler的存储配置和oracle 端的服务配置 参考文档:https://www.oracle.com/technetwork/cn/ ...

  2. python开发mysql:视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  3. python开发线程:死锁和递归锁&信号量&定时器&线程queue&事件evevt

    一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...

  4. C# 读取INI

    虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中. INI文件是文 ...

  5. php写一个判断是否有cookie的脚本

    前言: 刚刚学习完cookie函数,写个练习. 0x01: //其实第二个应该改为elseif,但是我懒.啊哈 <?php $vlas="BnJhiFoPS4"; if(is ...

  6. [C#] 等待启动的进程执行完毕

    有能有时候我们启动了一个进程,必须等到此进程执行完毕,或是,一段时间, 关闭进程后再继续往下走. Example sample1 等待应用程序执行完毕 //等待应用程序执行完毕 private voi ...

  7. Elasticsearch之kopf插件安装之后的浏览详解

    前提, Elasticsearch之插件介绍及安装 https://i.cnblogs.com/posts?categoryid=950999&page=2  (强烈建议,从头开始看) 比如, ...

  8. 查询sqlserver数据库视图、存储过程等包含特定的字符串

    SELECT A.name , B.definition FROM SYS.objects A INNER JOIN sys.sql_modules B ON A.object_id = B.obje ...

  9. sql合并列

    oralce写法: select WM_CONCAT(A.title) as citys from tmpcity A sql server写法: select stuff((select ','+A ...

  10. day58-activiti 02-历史数据查询

    Activity 笔记  第二天 今天内容安排: 1.历史数据查询 办过多少个任务, 这些历史数据有时候我们也需要去查询一下. 本身day02这个项目就没有导jar包,有点类似于maven,在你的项目 ...