NSCache的简单使用
简介
1)NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存。
2)NSCache 在系统内存很低时,会自动释放一些对象(备注:在模拟器中内存警告时,缓存不会做清理动作)。开发中为了确保收到内存警告时真正释放内存,最好调用 - (void)removeAllObjects; 方法。
3)NSCache 是线程安全的,在多线程操作中,不需要对 NSCache 加锁。
4)NSCache 的 key 只是做强引用,不需要实现 NSCopying协议
属性:
/** 名称 */
@property (copy) NSString *name;
/** 代理 */
@property (nullable, assign) id<NSCacheDelegate> delegate;
/** 缓存空间的最大总成本,超出上限会自动回收对象,默认值是 0,表示没有限制 */
@property NSUInteger totalCostLimit;
/** 能够缓存对象的最大数量,默认值是 0,表示没有限制 */
@property NSUInteger countLimit;
/** 标识缓存是否回收废弃的内容,默认值是 YES,表示自动回收 */
@property BOOL evictsObjectsWithDiscardedContent;
方法:
/**
返回与键值关联的对象
*/
- (nullable ObjectType)objectForKey:(KeyType)key; /**
在缓存中设置指定键名对应的值,与可变字典不同,缓存对象不会对键名做 copy 操作,0 成本
*/
- (void)setObject:(ObjectType)obj forKey:(KeyType)key; /**
在缓存中设置指定键名对应的值,并且指定该键值对的成本。当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素
@param cost 成本 (cost) 用于计算记录在缓冲中的所有对象的总成本
*/
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g; /**
删除缓存中,指定键名的对象
*/
- (void)removeObjectForKey:(KeyType)key; /**
删除缓存中所有对象
*/
- (void)removeAllObjects;
委托方法:
/**
缓存将要删除对象时调用,注意:不能在此方法中修改缓存!!
*/
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
简单实例:
/** * 在此提供一个例子来进行缓存使用的说明 * 需求:将字符串存入缓存,并进行查看和清理。 * 准备:在Main.storyboard中添加按钮,分别为添加、检查和删除缓存。(在此使用需要成本的方式进行测试) */
1、创建缓存对象
/** 缓存属性 */
@property (nonatomic, strong) NSCache *cache;
// 通过懒加载的方式创建缓存对象
- (NSCache *)cache{
if (!_cache) {
_cache = [[NSCache alloc] init];
// 设置成本为5 当存储的数据超过总成本数,NSCache会自动回收对象
_cache.totalCostLimit = ;
// 设置代理 代理方法一般不会用到,一般是进行测试的时候使用
_cache.delegate = self;
}
return _cache;
}
2、实现按钮的点击方法
// 添加缓存
- (IBAction)addCache {
for (int i = ; i < ; i++) {
NSString *str = [NSString stringWithFormat:@"在这里进行了存储数据"];
// 设置成本数为1
[self.cache setObject:str forKey:@(i) cost:];
NSLog(@"存储数据----%@",@(i));
}
}
// 检查缓存
- (IBAction)checkCache {
NSLog(@"---------------------------------------------");
for (int i = ; i < ; i++) {
NSString *str = [self.cache objectForKey:@(i)];
if (str) {
NSLog(@"取出缓存中存储的数据-----%@",@(i));
}
}
}
// 清理缓存
- (IBAction)deleteCache {
[self.cache removeAllObjects];
NSLog(@"清理缓存");
}
3、实现代理
#pragma mark - NSCacheDelegate
// 即将回收对象的时候进行调用,实现代理方法之前要遵守NSCacheDelegate协议。
- (void)cache:(NSCache *)cache willEvictObject:(id)obj{
NSLog(@"回收--------%@",obj);
}
4、打印说明
4.1 点击添加按钮的打印 存储数据---- 存储数据---- 存储数据---- 存储数据---- 存储数据---- 回收--------在这里进行了存储数据 存储数据---- 回收--------在这里进行了存储数据 存储数据---- 回收--------在这里进行了存储数据 存储数据---- 回收--------在这里进行了存储数据 存储数据---- 回收--------在这里进行了存储数据 存储数据---- 4.2 点击检查按钮的打印 --------------------------------------------- 取出缓存中存储的数据----- 取出缓存中存储的数据----- 取出缓存中存储的数据----- 取出缓存中存储的数据----- 取出缓存中存储的数据----- 4.3 打印相关的解释 在此因为进行每个字符串对象存储时,成本是1,我们设置的总成本是5,字符串对象存储了10次,总成本是10,所以在存储数据5的时候会回收数据1的字符串对象,以此类推,所以打印的结果如上所示。关于清理缓存和其他相关的操作由读者们自行打印,在此不做赘述了。
补充:
/** * 如果把例子中的添加缓存写成如下方式,就不会存在回收的打印,在检查缓存的时候也会有10条数据。 * 解释:NSCache的Key只是对对象进行了Strong引用,而非拷贝。 * 当写在for循环外部时,所以对于字符串对象只是在内存中建立了10个强引用,而存储的真正的字符串对象只有一个(字符串对象只创建了一次),所以总成本为1。 * 当写在for循环内部时,字符串对象只是在内存中建立了10个强引用,而存储的真正的字符串对象有十个(每次都在创建新的字符串对象),所以总成本为10。 */ // 添加缓存
- (IBAction)addCache {
// NSCache的Key只是对对象进行了Strong引用,而非拷贝,
NSString *str = [NSString stringWithFormat:@"在这里进行了存储数据"];
for (int i = ; i < ; i++) {
// 设置成本数为1
[self.cache setObject:str forKey:@(i) cost:];
NSLog(@"存储数据----%@",@(i));
}
NSCache的简单使用的更多相关文章
- NSCache类的简单介绍
最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下. NSCache NSCache是苹果官方提供的缓存类,用法和NSMutableDicton ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
- NSURLCache 和 NSCache 的区别
NSURLCache 和 NSCache 的区别 NSURLCache提供的是URL Request缓存,可以在Memory和Disk上:NSCache提供了HTTP Request外的东西的缓存方式 ...
- 多线程与网络之SDWebImage和NSCache
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- iOS NSCache缓存类的了解
前言: 最近面试时,问到了限定并发数的视频下载,当时回答的时通过GCD_barrier 处理,回来想想也可以通过NSCache处理,所以顺便复习一下,这个知识点. 一,关于NSCache说明 说明 ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
随机推荐
- late_initcall和module_init的区别
在init.h中有如下定义: 详情参照:linux 设备驱动加载的先后顺序 #define pure_initcall(fn) __define_initcall("0",fn,1 ...
- GPU与CPU的区别
作者:虫子君 链接:https://www.zhihu.com/question/19903344/answer/96081382 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- python 序列化pickle 和 encode的区别
我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即un ...
- webrtc 实时视频 .net websocket信令服务器
这篇文章主要参考了 Webrtc WebSocket实现音视频通讯,非常感谢提供代码 前端部分完全是从这篇文章复制过来的,只是修改了webscket的url,还有加入了webrtc-adapterjs ...
- Beta冲刺(1/5)(麻瓜制造者)
今天小组进行了第一次冲刺,虽然新组员还没有确定. 今日完成任务 邓弘立:修改登录代码 李佳铭: 用户收藏UI代码编写 江郑: 进行了后台管理员界面ui的设计和环境的搭建 刘双玉:后台github仓库建 ...
- 2017-2018-2 20155314《网络对抗技术》Exp5 MSF基础应用
2017-2018-2 20155314<网络对抗技术>Exp5 MSF基础应用 目录 实验内容 实验环境 基础问题回答 预备知识 实验步骤--基于Armitage的MSF自动化漏洞攻击实 ...
- mvc:message-converters简单介绍
说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就是方法返回的类型,可以是字节数组.字符串.对象引用等, ...
- go标准库的学习-crypto/des
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/des" des包实现了DES标准和TDEA算法,参见U.S. Fed ...
- metamask源码学习-inpage.js
The most confusing part about porting MetaMask to a new platform is the way we provide the Web3 API ...
- day04流程控制之while
while语法: while 条件: 缩进的循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件. # 如果条件为假,那么循环体不执行,循环终止 示例一: "&qu ...