NSCache类的简单介绍
最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下。
NSCache
NSCache是苹果官方提供的缓存类,用法和NSMutableDictonary非常类似.
NSCache是一个类似于集合的容器,即缓存。它存储key-value,这一点非常类似字典。开发者一般用NSCache来缓存临时存储短时间但是使用成本高的对象。重用这些对象可以优化性能,因为它们的值不在被重新计算。另外一方面,这些对象对于程序来说是不要紧的,在内存紧张的时候会被丢弃,如果对象被丢弃了,则下次使用的时候需要重新计算.
当一个key-value对象缓存时,缓存维护它的一个强引用。存储在NSCache中的通用类型通常是实现了NSDiscardableContent协议的对象.,
NSDiscardableContent对象在其内容被NSDiscardableContent被放进缓存,则在对象被移除时,缓存会调用discardContentIfPossible方法。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与可变集合的不同:
NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用2.
NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。3.不像
NSMutableDictionary对象,一个缓存对象不会拷贝key对象NSCache类的简单介绍的更多相关文章
- c++string类的简单介绍
		
#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...
 - python类的简单介绍
		
类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色.它们提供了创建“真实”对象(也就是实例)的蓝图.因为Python 并不强求你以面向对象的方式编程(与Java 不同), 此刻你也可以不学习类. ...
 - UML类图简单介绍
		
先上一张图: 概述 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础.类图主要是用来显示系统中的类.接口以及它们之间的静态结构和关系的一种静态模型. 类图组 ...
 - Class类和ClassLoader类的简单介绍
		
反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; 1.Class类: 1. 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构 ...
 - VC中CRect类的简单介绍
		
CRect CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数.在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都 ...
 - java中Runtime类和Process类的简单介绍
		
在java.lang包当中定义了一个Runtime类,在java中对于Runtime类的定义如下: Java code public class Runtime extends Object 每个 J ...
 - [常用类]排序及Arrays类(简单介绍)
		
冒泡排序bubble sort 轻的上浮,重的下沉.两个相邻位置比较,如果前面元素比后面的元素大就换位置 选择排序 select sort 用一个索引上的元素,依次和其他位置上的元素比较,小的放前面 ...
 - Duilib中各个类的简单介绍
		
DirectUI意为直接在父窗口上绘图(Paint on parent dc directly).即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上.微软的“D ...
 - Java ArrayList类的简单介绍
		
ArrayList类的说明: ArrayList类是List接口的实现类,java.util.ArrayList集合数据存储的结构是数组结构. 特点: 元素增删慢,查找快.(由于日常开发中使用最多的功 ...
 
随机推荐
- hdu1509(Windows Message Queue) 优先队列
			
点击打开链接 Problem Description Message queue is the basic fundamental of windows system. For each proces ...
 - C++/C混合编程
			
C与C++混合编程 C++ 是在 C 语言的基础上发展起来的.在某种程度上,我们可将 C++ 看做 C 的一种扩展.在本质上,二者的数据类型和函数调用惯例都是一致的,因此 C 与 C++ 混合编译也是 ...
 - (二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
			
1. 依赖配置 1.1 依赖配置主要包含如下元素: <!--添加依赖配置--> <dependencies> <!--项目要使用到junit的jar包,所以在这里添加ju ...
 - JSON.parse 函数
			
JSON.parse 函数 JavaScript JSON.parse 函数 (JavaScript) 将 JavaScript 对象表示法 (JSON) 字符串转换为对象. JSON.parse(t ...
 - IOC容器Autofac
			
//类ContainerBuilder中的方法: RegisterType<T>()//注册类型T AsImplementedInterfaces()//表示注册的类型,以接口的方式注册 ...
 - Silverlight实例教程 - Validation数据验证基础属性和事件(转载)
			
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
 - 辛星让mysql跑的更快第一节之优化的方向和数据库建模
			
近期计划写一套书目,也就是关于mysql的优化的.那么首先在博客上写写,然后整理成pdf的文档的形式,当然也期待各位的关注了.对于mysql的优化是一个比較大的话题.可优化的地方也非常多,大致想了一下 ...
 - CSS3主要知识点复习总结+HTML5新增标签
			
文件夹: 1.CSS 属性编写顺序 2.CSS3属性(内核前缀) 3.position相对/绝对定位 4.overflow:scroll等的差别 5.display属性应用 6.盒模型计算方法和Bug ...
 - log4cxx日志库RedHat下安装
			
今天领导交给我一个任务:把log4cxx库在Redhat系统上面安装起来 首先.我得到信息,安装这个库一共须要三个软件 apr-1.4.6.tar.gz apr-util-1.4.1.tar.gz a ...
 - ubuntu 16.04菜单栏不显示
			
解决办法: restart unity-pannel-service