前言

  • 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 缓存的更多相关文章

  1. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  2. iOS之 清理缓存

    作为一个开发者,对于缓存的清理也是理所应当的需要的.这次就简单的谈一下iOS中对于缓存的清理方法. 我们清理缓存通常是在这三种方式下进行的: (1)项目中的清理缓存按钮 (2)点击退出app按钮时清理 ...

  3. iOS中dyld缓存的实现原理是怎样的?

    在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...

  4. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  5. ios+oc面试题

    ios+oc面试题     浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...

  6. 玩转iOS开发 - 数据缓存

    Why Cache 有时候.对同一个URL请求多次,返回的数据可能都是一样的,比方server上的某张图片.不管下载多少次,返回的数据都是一样的. 上面的情况会造成下面问题 (1)用户流量的浪费 (2 ...

  7. iOS html5使用缓存并及时更新方案总结

    最近一段时间研究了一下H5在iOS移动端表现时使用缓存并可及时更新方案,总结如下: 一.使用Webview自带缓存机制 当我们使用webview加载html资源时的,本质上就是一个向服务器索取资源的h ...

  8. iOS开发网络缓存原理

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

  9. iOS 清理文件缓存

    本文摘自:<msp的昌伟哥哥-iOS开发-清理缓存功能的实现>摘下来的目的就是为了能够学习.还望看到文章的同学,前往原创的博客园.感谢msp的昌伟哥哥的分享精神. 移动应用在处理网络资源时 ...

随机推荐

  1. Hive报错之java.sql.SQLException: Field 'IS_STOREDASSUBDIRECTORIES' doesn't have a default value

    在创建表的时候报出如下错误: hive> create table if not exists testfile_table( > site string, > url string ...

  2. MySQL start and stop

    一.本文说明 本实验主要是演示MySQL的四种启动方式,附带停止的操作. 二.mysqld mysqld is the MySQL server   mysqld reads options from ...

  3. jstl和jsp脚本变量相互访问

    1.jsp脚本访问jstl标准动作的变量,可以通过隐式的范围变量来获取,对于页面作用域的变量,可以通过pageContext.getAttribute()来获取,也可以通过动作来获取: <c:s ...

  4. Codeforces 733C:Epidemic in Monstropolis(暴力贪心)

    http://codeforces.com/problemset/problem/733/C 题意:给出一个序列的怪兽体积 ai,怪兽只能吃相邻的怪兽,并且只有体积严格大于相邻的怪兽才能吃,吃完之后, ...

  5. Android onTouchEvent, onClick及onLongClick的调用机制

    针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件? 在Android中,一次用户操作可以被不同的View按次序 ...

  6. IP Address 分类: POJ 2015-06-12 19:34 12人阅读 评论(0) 收藏

    IP Address Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19125   Accepted: 11053 Desc ...

  7. 未完成的任务之:下载、安装、体验 Gentoo

    Gentoo,伟大的Gentoo是Linux世界最年轻的发行版本,正因为年轻,所以能吸取在她之前的所有发行版本的优点,这也是Gentoo被称为最完美的Linux发行版本的原因之一. 如果你需要一个桌面 ...

  8. 【Linux】CentOS设置静态IP(非动态获取IP)

    在VMware上安装好Linux后,默认设置的动态IP,每次启动的IP都不同,远程连接挺费劲的. 于是,需要设置静态的IP,至少我从远程工具连接上去方便多了.另外,为了安装一些软件,也需要访问互联网. ...

  9. Python 2.7.9 Demo - isinstance

    #coding=utf-8 #!/usr/bin/python a = 'abc'; print isinstance(a, str);

  10. MySQL基础(五)——视图

    MySQL基础(五)--视图