最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下。

NSCache

NSCache是苹果官方提供的缓存类,用法和NSMutableDictonary非常类似.

NSCache是一个类似于集合的容器,即缓存。它存储key-value,这一点非常类似字典。开发者一般用NSCache来缓存临时存储短时间但是使用成本高的对象。重用这些对象可以优化性能,因为它们的值不在被重新计算。另外一方面,这些对象对于程序来说是不要紧的,在内存紧张的时候会被丢弃,如果对象被丢弃了,则下次使用的时候需要重新计算.

当一个key-value对象缓存时,缓存维护它的一个强引用。存储在NSCache中的通用类型通常是实现了NSDiscardableContent协议的对象.,

在缓存中存储这类对象的好处是,当你不需要它的时候可以丢弃这些内容,以节省内存.默认情况下,缓存中的NSDiscardableContent对象在其内容被
丢弃的时候,会被移除缓存,如果一个NSDiscardableContent被放进缓存,则在对象被移除时,缓存会调用discardContentIfPossible方法。
NSCache在系统发出低内存通知时,会自动删除缓存
例如当不断给NSCache填充数据时,应用内存会越来越大,当大小在500M左右时,系统抛出Received memory warning ,此时查看内存,发现内存会减少,因为NSCache在内存警报时,会自动删除缓存。
NScache可以设置数量限制和大小设置,countLimit设置数量限制的,totalCount是设置大小的,但是通常不用,计算也比较麻烦。
NSCache是线程安全的 再多线程操作中,不需要对其加锁。而且NSCache的key只是对对象进行强引用,不是拷贝。

NSCache的用法

@interface NSCache <KeyType, ObjectType> : NSObject {
@private
id _delegate;
void *_private[];
void *_reserved;
} @property (copy) NSString *name; //名称 @property (nullable, assign) id<NSCacheDelegate> delegate; //设置代理 - (nullable ObjectType)objectForKey:(KeyType)key;// 取出缓存的键值对。
- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 设置缓存的键值对
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;// 设置缓存的键值对,
并指定改键值对的成本,用于计算记录在缓存中的总成本,出现内存警告或者内存总成本超出上限的时候,混存会开启一个回收过程,删除部分元素.
- (void)removeObjectForKey:(KeyType)key; - (void)removeAllObjects; @property NSUInteger totalCostLimit; // 缓存空间的最大总成本,超出上限会自动回收对象,默认为0,表示没有限制.
@property NSUInteger countLimit; // 能够缓存的对象的最大数量,默认为0,表示没有限制
@property BOOL evictsObjectsWithDiscardedContent; //标识缓存是否回收废弃的内容 @end @protocol NSCacheDelegate <NSObject>
@optional
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;//即将要回收对象的时候 调用该方法。
@end
- (NSCache *)cache {
if (_cache == nil) {
_cache = [[NSCache alloc] init];
}
return _cache;
}
//存储数据
- (IBAction)addCache:(id)sender {
for (NSInteger i = ; i < ; i ++) {
NSString *str = [NSString stringWithFormat:@"tian%ld",(long)i];
[self.cache setObject:str forKey:@(i)];
}
} - (IBAction)checkCache:(id)sender {
for (NSInteger i = ; i < ; i ++) {
NSString *str = [self.cache objectForKey:@(i)];
if (str) {
NSLog(@"取出的数据: %@",str);
}
}
} - (IBAction)deleteCache:(id)sender {
NSString *str = [self.cache objectForKey:@()];
if (str) {
[self.cache removeObjectForKey:@()];
}
}
_cache.totalCostLimit = ;//总成本是5,如果缓存的总成本超过5 就回收之前的缓存对象
//配合- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g 使用g就是缓存一个对象的成本

NSCache与可变集合的不同:

1.NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用
2.NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。
3.不像NSMutableDictionary对象,一个缓存对象不会拷贝key对象
 
 

NSCache类的简单介绍的更多相关文章

  1. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

  2. python类的简单介绍

    类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色.它们提供了创建“真实”对象(也就是实例)的蓝图.因为Python 并不强求你以面向对象的方式编程(与Java 不同), 此刻你也可以不学习类. ...

  3. UML类图简单介绍

    先上一张图: 概述 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础.类图主要是用来显示系统中的类.接口以及它们之间的静态结构和关系的一种静态模型. 类图组 ...

  4. Class类和ClassLoader类的简单介绍

    反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; 1.Class类: 1. 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构 ...

  5. VC中CRect类的简单介绍

    CRect CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数.在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都 ...

  6. java中Runtime类和Process类的简单介绍

    在java.lang包当中定义了一个Runtime类,在java中对于Runtime类的定义如下: Java code public class Runtime extends Object 每个 J ...

  7. [常用类]排序及Arrays类(简单介绍)

    冒泡排序bubble sort  轻的上浮,重的下沉.两个相邻位置比较,如果前面元素比后面的元素大就换位置 选择排序 select sort 用一个索引上的元素,依次和其他位置上的元素比较,小的放前面 ...

  8. Duilib中各个类的简单介绍

    DirectUI意为直接在父窗口上绘图(Paint on parent dc directly).即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上.微软的“D ...

  9. Java ArrayList类的简单介绍

    ArrayList类的说明: ArrayList类是List接口的实现类,java.util.ArrayList集合数据存储的结构是数组结构. 特点: 元素增删慢,查找快.(由于日常开发中使用最多的功 ...

随机推荐

  1. IOS下拉放大图片

    代码地址如下:http://www.demodashi.com/demo/11623.html 一.实现效果图 现在越来越多的APP中存在下拉放大图片的效果,今天贡献一下我的实现这种方法的原理,和我遇 ...

  2. 用jQuery和PHP来实现转盘抽奖程序

    准备工作 首先要准备素材,抽奖的界面用到两张图片,圆盘图片和指针图片,实际应用中可以根据不同的需求制作不同的圆盘图片. 接着制作html页面,实例中我们在body中加入如下代码: <div cl ...

  3. VS2017、netcore版本更新升级

    VS2017 剩下的就是下一步了. netcore 访问:https://www.microsoft.com/net/download/archives 找到对应版本(最新版本) 下载安装就可以了 装 ...

  4. 红茶一杯话Binder (传输机制篇_中)

    红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBind ...

  5. 【转载】IE下利用滤镜实现背景颜色渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. NYOJ 诡异的电梯 && nyoj 1204 魔法少女

    诡异的电梯[Ⅰ] 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 新的宿舍楼有 N(1≤N≤100000) 层 and M(1≤M≤100000)个学生. 在新的宿舍楼里 ...

  7. html 标签 链接

    <a href="http://www.baidu.com">百度</a> <a href="#here">here< ...

  8. Java基础10 接口的继承与抽象类(转载)

    接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型.比如,我们以Cup作为原interface:  interface Cup{ ...

  9. Servlet 调试

    测试/调试 Servlet 始终是开发使用过程中的难点.Servlet 往往涉及大量的客户端/服务器交互,可能会出现错误但又难以重现. 这里有一些提示和建议,可以帮助您调试. System.out.p ...

  10. char * const p和const char *p的区别

    1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表 ...