NSCache类的简单介绍

最近看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[5];
    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 = 0; i < 10; i ++) {
        NSString *str = [NSString stringWithFormat:@"tian%ld",(long)i];
        [self.cache setObject:str forKey:@(i)];
    }
}

- (IBAction)checkCache:(id)sender {
    for (NSInteger i = 0; i < 10; i ++) {
        NSString *str = [self.cache objectForKey:@(i)];
        if (str) {
            NSLog(@"取出的数据:  %@",str);
        }
    }
}

- (IBAction)deleteCache:(id)sender {
    NSString *str = [self.cache objectForKey:@(1)];
    if (str) {
        [self.cache removeObjectForKey:@(1)];
    }
}
_cache.totalCostLimit = 5;//总成本是5,如果缓存的总成本超过5 就回收之前的缓存对象
        //配合- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g 使用g就是缓存一个对象的成本

NSCache与可变集合的不同:

1.NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用

2.NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。

3.不像NSMutableDictionary对象,一个缓存对象不会拷贝key对象

原文地址:https://www.cnblogs.com/huanying2000/p/8663135.html

时间: 2024-08-02 10:57:16

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

c++string类的简单介绍

#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family:c++中string类的简单介绍 *time:2019.2.12 */ int main() { string s;//string类的创建 /*下述均是string的成员函数*/ s = "123";//=直接进行赋值 cout <<"字符串长度为:"&l

一.SalesForce中Schema类的简单介绍

一.Schema以及Schema NameSpace是什么 在SalesForce中Schema指的是应用程序中对象(Object)以及对象之间的各种关系.Schema NameSpace中包含了好多的类和方法,通过这些类和方法,可以访问Schema的一些基本信息. 二.Schema常用的类和方法 在Schema NameSpace中包含了很多的类以及方法,在此并不会对所有的类和方法做介绍,只会对其中几个类的几个方法做简单介绍. 1.Schema.getGlobalDescribe方法``这个方

网络开发--NSURLConnection类的简单介绍

 NSURL 请求地址  NSURLRequest  封装一个请求,保存发给服务器的全部数据  NSMutableURLRequest  NSURLRequest的子类,提供了改变请求的属性的方法  NSURLConnection 负责发送请求,建立客户端和服务器的连接.发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据 NSMutableURLRequest改变请求的属性方法如下: NSURL *url = [NSURL urlWithString@"http://serv

BufferedReader子类LineNumberReader装饰类的简单介绍

个人感觉这个类其实没什么特殊的功能,只有很少的时候会使用到其中的功能其中有这么两个多出来的功能 setLineNumber public void setLineNumber(int lineNumber) 设置当前行号. 参数: lineNumber - 指定行号的 int 值 另请参见: getLineNumber() getLineNumber public int getLineNumber() 获得当前行号. 返回: 当前行号 另请参见: setLineNumber(int) 那么我们

OC基础(十)类的本质及isa指针和元类的简单介绍

一.类的基本概念: 1.类其实也是一个对象, 这个对象会在这个类第一次被使用的时候创建 2.只要有了类对象, 将来就可以通过类对象来创建实例对象 3.实例对象中有一个isa指针, 指向创建自己的类对象 4.类对象中保存了当前对象所有的对象方法 5.当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找 6.所有类对象的继承关系就是元类对象的继承关系 二.isa指针 1.每一个对象都包含一个isa指针.这个指针指向当前对象所属的类. 2.[d bark];表示给d所指向

Duilib中各个类的简单介绍

DirectUI意为直接在父窗口上绘图(Paint on parent dc directly).即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上.微软的“DirectUI”技术广泛的应用于Windows XP.Vista.Windows 7,如浏览器左侧的TaskPanel,控制面板导航界面,Media Player播放器,即时通讯工具MSN Messager等. DirectUI好处在于可以很方便的构建高效.绚丽的.非常易于扩展的界面.国外如微软,国

Snmp类的简单介绍

Snmp类提供了一套有关Snmp的功能接口.具体来讲,就是发送.接受.创建Snmp消息.一个Snmp对象是一个Session,而在Snmp4j中,一个Session可以同多个远程设备通信. (1)Snmp.Target.PDU三者的关系 Target代表远程设备或者远程实体.PDU代表管理端同Target通信的数据,Snmp就代表管理者管理功能(其实就是数据的收发)的具体执行者.打个比方:Target就是你远方的恋人,PDU就是你们之间传递的情书.而Snmp就是负责帮你寄信收信的邮差. (2)S

Class类和ClassLoader类的简单介绍

反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; 1.Class类: 1. 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器.某个类到底实现了 哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含可特定的某个类的有关信息. 2.Class对象只能由系统建立对象. 3.一个类在JVM中只会有一个Class实例. 4.每个类的实例都会记得自己是由哪个Class实例产生的. 5.

iOS开发—音频的播放的简单介绍和封装工具类

iOS开发—音频的播放的简单介绍和封装工具类 一.音效的播放简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较长 框架:播放音频需要用到AVFoundation.framework框架 二.音效的播放 1.获得音效文件的路径 NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav&qu