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 {
}
iOS - OC NSCache 缓存的更多相关文章
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- iOS之 清理缓存
作为一个开发者,对于缓存的清理也是理所应当的需要的.这次就简单的谈一下iOS中对于缓存的清理方法. 我们清理缓存通常是在这三种方式下进行的: (1)项目中的清理缓存按钮 (2)点击退出app按钮时清理 ...
- iOS中dyld缓存的实现原理是怎样的?
在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...
- iOS - OC 面向对象语法
1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...
- ios+oc面试题
ios+oc面试题 浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...
- 玩转iOS开发 - 数据缓存
Why Cache 有时候.对同一个URL请求多次,返回的数据可能都是一样的,比方server上的某张图片.不管下载多少次,返回的数据都是一样的. 上面的情况会造成下面问题 (1)用户流量的浪费 (2 ...
- iOS html5使用缓存并及时更新方案总结
最近一段时间研究了一下H5在iOS移动端表现时使用缓存并可及时更新方案,总结如下: 一.使用Webview自带缓存机制 当我们使用webview加载html资源时的,本质上就是一个向服务器索取资源的h ...
- iOS开发网络缓存原理
一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...
- iOS 清理文件缓存
本文摘自:<msp的昌伟哥哥-iOS开发-清理缓存功能的实现>摘下来的目的就是为了能够学习.还望看到文章的同学,前往原创的博客园.感谢msp的昌伟哥哥的分享精神. 移动应用在处理网络资源时 ...
随机推荐
- [转]linux主机644、755、777权限详解
转自:http://my.oschina.net/qihh/blog/73135 从左至右,第一位数字代表文件所有者的权限,第二位数字代表同组用户的权限,第三位数字代表其他用户的权限. 从左至右,第一 ...
- Codeforces 745C:Hongcow Builds A Nation(并查集)
http://codeforces.com/problemset/problem/744/A 题意:在一个图里面有n个点m条边,还有k个点是受限制的,即不能从一个受限制的点走到另外一个受限制的点(有路 ...
- 文件名唯一(A.txt => An.txt)
/// <summary> /// 文件名唯一(A.txt => An.txt) /// </summary> /// <param name="full ...
- 【转载】使用barman备份PostgreSQL
什么是barman Barman (备份和恢复管理器) 是 PostgreSQL 数据库服务器中非常方便的备份和恢复工具,允许远程备份多个服务器,允许从一个备份集中一个命令就恢复数据库.同时还可以对多 ...
- Hibernate jar包详解
Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍. 下载Hibernate,例如2.0.3稳定版本,解 ...
- InheritableThreadLocal原理
转载:https://github.com/pzxwhc/MineKnowContainer/issues/20 介绍 InheritableThreadLocal 之前,假设对 ThreadLoca ...
- define与typedef 区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如:#define PI 3. ...
- 放松时刻——C#分割字符串
让我们来练习一下字符串的分割~把话倒过来说: private void change_button_Click(object sender, EventArgs e) { var after_text ...
- tomcant报错The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
下载与你Tomcat对应版本的 tcnative-1.dll,放到apache-tomcat-7.0.57\bin 目录下,重启tomcat http://archive.apache.org/dis ...
- 反射获取类中的属性和set属性
package framework.base; import java.beans.IntrospectionException; import java.beans.PropertyDescript ...