介绍

  • NSCache 是苹果提供的一个专门用来做缓存的类
  • 使用和 NSMutableDictionary 非常相似.但是是线程安全的
  • 取值

    • - (id)objectForKey:(id)key;
  • 设置对象,0成本

    • - (void)setObject:(id)obj forKey:(id)key;
  • 设置对象并指定成本

    • - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
  • 成本示例,以图片为例:

    • 方案一:缓存 100 张图片
    • 方案二:总缓存成本设定为 10M,以图片的 宽 * 高当作成本,图像像素。这样,无论缓存的多少张照片,只要像素值超过 10M,就会自动清理
    • 结论:在缓存图像时,使用成本,比单纯设置数量要科学!
  • 删除某个缓存的内容

    • - (void)removeObjectForKey:(id)key;
  • 删除全部

    • - (void)removeAllObjects;
    • 不能在 - (void)didReceiveMemoryWarning中调用此方法,否则NSCache就失效了

属性

  • @property NSUInteger totalCostLimit;

    • 缓存总成本
  • @property NSUInteger countLimit;

    • 缓存总数量
  • @property BOOL evictsObjectsWithDiscardedContent;

    • 是否自动清理缓存,默认是 YES

示例代码

 1 #import "ViewController.h"
 2
 3 @interface ViewController () <NSCacheDelegate>
 4
 5 @end
 6
 7 @implementation ViewController {
 8
 9     /// 全局缓存池
10     NSCache *_cache;
11 }
12
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15
16     // 实例化缓存池
17     _cache = [[NSCache alloc] init];
18
19     // 设置缓存成本 : 以最大的缓存个数为例(最多存5个对象)
20     _cache.countLimit = 5;
21
22     // 遵守协议 : 有个唯一的代理方法,专门监听对象从cache里面移除
23     _cache.delegate = self;
24 }
25
26 /// 添加对象
27 - (IBAction)addObj:(id)sender
28 {
29     for (NSInteger i = 0; i<10; i++) {
30
31         NSString *key = [NSString stringWithFormat:@"hello_%zd",i];
32
33         NSString *obj = [NSString stringWithFormat:@"hello_%zd",i];
34         NSLog(@"add %@",obj);
35
36         [_cache setObject:obj forKey:key];
37     }
38 }
39
40 /// 读取对象
41 - (IBAction)readObj:(id)sender
42 {
43     for (NSInteger i = 0; i<10; i++) {
44
45         NSString *key = [NSString stringWithFormat:@"hello_%zd",i];
46
47         // 存进去是什么,取出来应该就是什么
48         NSString *obj = [_cache objectForKey:key];
49         NSLog(@"read %@",obj);
50     }
51 }
52
53 - (IBAction)removeAll:(id)sender
54 {
55     [_cache removeAllObjects];
56 }
57
58 /// 这个代理方法,只在cache里面有对象被移除时调用
59 - (void)cache:(NSCache *)cache willEvictObject:(id)obj
60 {
61     // obj : 就是即将被移除的对象
62     NSLog(@"移除 %@",obj);
63 }
64
65 /// NSCache的大坑 : 这个方法里面不能调用`removeAllObjects`;一旦调用了,cache就失效了
66 - (void)didReceiveMemoryWarning {
67     [super didReceiveMemoryWarning];
68
69     [_cache removeAllObjects];
70 }
71
72 @end

转载于:https://www.cnblogs.com/panda1024/p/6277775.html

NSCache实现内存缓存相关推荐

  1. YYCache 源码解析(一):使用方法,架构与内存缓存的设计

    YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识. ...

  2. C#开源磁盘/内存缓存引擎

    前言 昨天写了个 <基于STSdb和fastJson的磁盘/内存缓存>,大家可以先看看.下午用到业务系统时候,觉得可以改进一下,昨晚想了一个晚上,刚才重新实现一下. 更新 1. 增加了对批 ...

  3. Android 图片缓存之内存缓存技术LruCache,软引用

    Android 图片缓存之内存缓存技术LruCache,软引用

  4. 图片缓存之内存缓存技术LruCache,软引用

    图片缓存之内存缓存技术LruCache,软引用 每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个 问题曾经让我觉得很烦恼 ,后来终于得到了解决, 那么现在就让我和大家一起分享 ...

  5. mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置

    mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置 转载自勤奋的小青蛙 mongodb占用内存非常高,这是因为官方为了提升存储的效率,设计就这么设计的. 但是大部分的个人 ...

  6. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  7. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  8. java cache详解,Java内存缓存详解

    1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...

  9. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

最新文章

  1. HTTP/HTTPS的请求和响应
  2. 使用ngNonBindable在Angular双向绑定数据的时候显示“{{参数}}“中的花括弧、花括号“{{}}”
  3. Modeling System Behavior with Use Case(3)
  4. nginx_gzip压缩提升网站的传输速度
  5. 基于C#局域网语音聊天
  6. 近世代数--有限交换群--存在元素的阶是群阶的素因子
  7. Windows PowerShell下基础操作
  8. hdu2063 二分图(基础题)
  9. Sqoop1使用手册
  10. ASP.NET Core整合Zipkin链路跟踪
  11. Ajax 技术资源中心
  12. 特斯拉两高管被爆离职,股价狂跌超过10%,马斯克宣布高层大换血
  13. Excel潜能系列——Excel游戏(2v2战斗~5v5战斗模拟器)【更新V1.5】 Einsphoton
  14. Office快捷键大全之三(Access快捷键上篇)
  15. 学习java框架-J2EE体系-Spring-IOC-AOP-Bean-事务-
  16. wireshark分析实战
  17. 【保定SEO】怎么做好SEO关键词优化工作
  18. 一种Android输入框待输入字符去除文本监听回调的方案思路
  19. EasyExcel多列单元格设置下拉框
  20. 如何创建html文件

热门文章

  1. c语言静态函数调用静态变量_C语言中的静态变量和函数
  2. C# 编译的DLL文件在其他项目中调用时,看不见注释
  3. ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤
  4. 路由接口无法配时钟频率
  5. 第三方平台也能为未微信认证的订阅号调用自定义菜单接口和素材管理接口
  6. Ubuntu12.04上编译PlateGatewayQt
  7. Leetcode 30.串联所有单词的子串
  8. Leetcode 814.二叉树剪枝
  9. 【CV】如何使用Tensorflow提供的Object Detection API --2--数据转换为TFRecord格式
  10. 机器学习经典损失函数复习:交叉熵(Cross Entropy)和KL散度