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托管内存)来做缓存,这样对于单个应用服务 ...
随机推荐
- dell R740在安装完Esxi6.0U3之后出现存储器警告
最近公司新增3台戴尔R740服务器,这边分别分配内网地址0.16,0.17,0.18三个IP 然后第一天查询了ESxi6.0版本要U3A10这个版本的vmware才能兼容R740服务器 然后安装完0. ...
- ORA-12538;ORA-12154;使用PL/SQL dve无法连接远程服务器上的oracle数据库,同时本机上也安装了一个oracle数据库
问题描述:本人使用PL/SQL dve连接远程服务器上的oracle数据库,一直是没有问题的.我想提高下自己在数据库方面的能力就在自己的笔记本上安装了一个oracle数据库实例,安装并配置好之后,使用 ...
- 网络编程——socket开发
Socket套接字方法 socket 实例类(8-10分钟) socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ...
- January 12th, 2018 Week 02nd Friday
Nothing behind me, everything ahead of me, as is ever so on the road. 我的身后空空荡荡,整个世界都在前方,这就是在路上. That ...
- <20190103>别傻了,一些 新的技术注定只适合新人
故障现象: 用vmware跑的虚拟机不兼容 某银行网银的U盾. 插入usb口后无法识别U盾, 解决过程: 1 更换2台各自不同电脑, 使用前置USB口, 后置USB口. 故障依旧. 2 使 ...
- Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:
一:查询字符串类型的字段的值不为空的SQL: select * from TB_CMS_FLGTINFO_A t where (t.fsta is not null and t.fsta <&g ...
- python 在windows下的 虚拟环境
解决 python 环境问题 windows 下安装 pip install virtualenv virtualenv的基本使用 1.1 创建虚拟环境 virtualenv venv 为环境指定Py ...
- Python向上取整,向下取整以及四舍五入函数
import math f = 11.2 print math.ceil(f) #向上取整 print math.floor(f) #向下取整 print round(f) #四舍五入 #这三个函数的 ...
- Python字符串操作之字符串分割与组合
12.字符串的分割和组合 12.1 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s ...
- read_csv报错Initializing from file failed
Python版本:Python 3.6 pandas.read_csv() 报错 OSError: Initializing from file failed,一般由两种情况引起:一种是函数参数为路径 ...