NSCache的简单使用

简介

1)NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存。

2)NSCache 在系统内存很低时,会自动释放一些对象(备注:在模拟器中内存警告时,缓存不会做清理动作)。开发中为了确保收到内存警告时真正释放内存,最好调用 - (void)removeAllObjects; 方法。

3)NSCache 是线程安全的,在多线程操作中,不需要对 NSCache 加锁。

4)NSCache 的 key 只是做强引用,不需要实现 NSCopying协议

属性:

/** 名称 */
@property (copy) NSString *name;
/** 代理 */
@property (nullable, assign) id<NSCacheDelegate> delegate;
/** 缓存空间的最大总成本,超出上限会自动回收对象,默认值是 0,表示没有限制 */
@property NSUInteger totalCostLimit;
/** 能够缓存对象的最大数量,默认值是 0,表示没有限制 */
@property NSUInteger countLimit;
/** 标识缓存是否回收废弃的内容,默认值是 YES,表示自动回收 */
@property BOOL evictsObjectsWithDiscardedContent;

方法:

/**
 返回与键值关联的对象
 */
- (nullable ObjectType)objectForKey:(KeyType)key;

/**
 在缓存中设置指定键名对应的值,与可变字典不同,缓存对象不会对键名做 copy 操作,0 成本
 */
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;

/**
 在缓存中设置指定键名对应的值,并且指定该键值对的成本。当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素
 @param cost 成本 (cost) 用于计算记录在缓冲中的所有对象的总成本
 */
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;

/**
 删除缓存中,指定键名的对象
 */
- (void)removeObjectForKey:(KeyType)key;

/**
 删除缓存中所有对象
 */
- (void)removeAllObjects;

委托方法:

/**
 缓存将要删除对象时调用,注意:不能在此方法中修改缓存!!
 */
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;

简单实例:

/**

* 在此提供一个例子来进行缓存使用的说明

* 需求:将字符串存入缓存,并进行查看和清理。

* 准备:在Main.storyboard中添加按钮,分别为添加、检查和删除缓存。(在此使用需要成本的方式进行测试)

*/ 

1、创建缓存对象

/** 缓存属性 */
@property (nonatomic, strong) NSCache *cache;
// 通过懒加载的方式创建缓存对象
- (NSCache *)cache{
    if (!_cache) {
          _cache = [[NSCache alloc] init];
         // 设置成本为5 当存储的数据超过总成本数,NSCache会自动回收对象
          _cache.totalCostLimit = 5;
         // 设置代理 代理方法一般不会用到,一般是进行测试的时候使用
         _cache.delegate = self;
      }
      return _cache;
}

2、实现按钮的点击方法

// 添加缓存
- (IBAction)addCache {
       for (int i = 0 ; i < 10 ; i++) {
            NSString *str = [NSString stringWithFormat:@"在这里进行了存储数据"];
             // 设置成本数为1
            [self.cache setObject:str forKey:@(i) cost:1];
             NSLog(@"存储数据----%@",@(i));
          }
}
// 检查缓存
- (IBAction)checkCache {
           NSLog(@"---------------------------------------------");
            for (int i = 0; i < 10 ; i++) {
            NSString *str = [self.cache objectForKey:@(i)];
                      if (str) {
                                 NSLog(@"取出缓存中存储的数据-----%@",@(i));
                        }
             }
}
// 清理缓存
- (IBAction)deleteCache {
      [self.cache removeAllObjects];
       NSLog(@"清理缓存");
}

3、实现代理

#pragma mark - NSCacheDelegate
// 即将回收对象的时候进行调用,实现代理方法之前要遵守NSCacheDelegate协议。
- (void)cache:(NSCache *)cache willEvictObject:(id)obj{
       NSLog(@"回收--------%@",obj);
}

4、打印说明

4.1 点击添加按钮的打印

存储数据----0

存储数据----1

存储数据----2

存储数据----3

存储数据----4

回收--------在这里进行了存储数据

存储数据----5

回收--------在这里进行了存储数据

 存储数据----6

 回收--------在这里进行了存储数据

 存储数据----7

回收--------在这里进行了存储数据

存储数据----8

回收--------在这里进行了存储数据

存储数据----9

4.2 点击检查按钮的打印

 ---------------------------------------------

取出缓存中存储的数据-----5

 取出缓存中存储的数据-----6

取出缓存中存储的数据-----7

 取出缓存中存储的数据-----8

取出缓存中存储的数据-----9

4.3 打印相关的解释

在此因为进行每个字符串对象存储时,成本是1,我们设置的总成本是5,字符串对象存储了10次,总成本是10,所以在存储数据5的时候会回收数据1的字符串对象,以此类推,所以打印的结果如上所示。关于清理缓存和其他相关的操作由读者们自行打印,在此不做赘述了。

补充:

/**

*  如果把例子中的添加缓存写成如下方式,就不会存在回收的打印,在检查缓存的时候也会有10条数据。

*  解释:NSCache的Key只是对对象进行了Strong引用,而非拷贝。

*  当写在for循环外部时,所以对于字符串对象只是在内存中建立了10个强引用,而存储的真正的字符串对象只有一个(字符串对象只创建了一次),所以总成本为1。

*  当写在for循环内部时,字符串对象只是在内存中建立了10个强引用,而存储的真正的字符串对象有十个(每次都在创建新的字符串对象),所以总成本为10。

*/

// 添加缓存
- (IBAction)addCache {
          // NSCache的Key只是对对象进行了Strong引用,而非拷贝,
           NSString *str = [NSString stringWithFormat:@"在这里进行了存储数据"];
            for (int i = 0 ; i < 10 ; i++) {
            // 设置成本数为1
            [self.cache setObject:str forKey:@(i) cost:1];
            NSLog(@"存储数据----%@",@(i));
 }

原文地址:https://www.cnblogs.com/weiming4219/p/8186250.html

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

NSCache的简单使用的相关文章

iOS缓存策略之NSCache的简单使用

NSCache是一个继承NSObjec的可变集合,是苹果提供的一套缓存机制,用键值(key-value)对来临时存储只需要短暂存储在内存中的数据,并且当内存空间很少的时候会可以自动释放一些资源. 概观 缓存(cache)对象和其他可变集合不同的几个方面. NSCache类包含了各种自动销毁策略,来保证缓存内容没有占用过多的系统内存.如果其他应用需要内存,这些策略会从系统中移除一些选项内容,来减少当前app占用的内存空间. 可以在不同的线程中对内存中的缓存执行添加.移除和查询操作,而不必自己锁住缓

NSCache类的简单介绍

最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下. NSCache NSCache是苹果官方提供的缓存类,用法和NSMutableDictonary非常类似. NSCache是一个类似于集合的容器,即缓存.它存储key-value,这一点非常类似字典.开发者一般用NSCache来缓存临时存储短时间但是使用成本高的对象.重用这些对象可以优化性能,因为它们的值不在被重新计算.另外一方面,这些对象对于程序来说是不要紧的,在内存紧张的时候会被丢弃

多线程与网络之SDWebImage和NSCache

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

NSCache 新手求带飞

NSCache是系统提供的一种类似于集合(NSMutableDictionary)的缓存, NSCache具有自动删除的功能,以减少系统占用的内存. 下面是简单的点击事件使用cache: - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //系统用来缓存的类 NSCache * cache = [[NSCache alloc] init]; //totalCostLimit 设置缓存大小

iOS7: 漫谈基础集合类(NSArray,NSSet,NSOrderedSet,NSDictionary,NSMapTable,NSHashTable, NSPointerArray, NSIndexSet,NSCache, NSFastEnumeration)

基础集合类是每一个Mac/iOS应用的基本组成部分.在本文中,我们将对”老类”(NSArray, NSSet)和”新类”(NSMapTable, NSHashTable, NSPointerArray)进行一个深入的研究,探索每一个的效率细节,并讨论其使用场景. 提示:本文包含一些参照结果,但它们并不意味着绝对精确,也没有进行多个.复杂的测试.这些结果的目的是给出一个快速和主要的运行时统计.所有的测试基于iPhone 5s,使用Xcode 5.1b1和iOS 7.1b1,64位的程序.编译选项设

快速生成沙盒目录的路径,多图片下载的原理(SDWebImage框架的简单介绍)

一.快速生成沙盒目录的路径 这个类主要是为了方便你快速拿到沙盒目录里文件夹的路径 给NSString写个分类 NSString+CHG.h #import <Foundation/Foundation.h> @interface NSString (CHG) // 用于生成文件在caches目录中的路径 - (instancetype)cacheDir; // 用于生成文件在document目录中的路径 - (instancetype)docDir; // 用于生成文件在tmp目录中的路径 -

iOS开发之缓存框架、内存缓存、磁盘缓存、NSCache、TMMemoryCache、PINMemoryCache、YYMemoryCache、TMDiskCache、PINDiskCache

1.在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力. 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化.常见的内存缓存有NSCache.TMMemoryCache.PINMemoryCache.YYMemoryCache.常见的磁盘缓存有TMDiskCache.PINDiskCache.YYCache. 1.本文章着重讲下YYCache. 这是为什么呢,因为他比其他的缓存框架更加高效,使用方便. YYCache: 去掉

iOS开发-NSCache

开发时,经常会遇到一个问题,从网络下载的图片应该如何来缓存?难道每次请求都要去下载一次?流量不要钱哇?所以比较好的方法就是把图片资源下载下来,保存到本地,然后下次直接从本地取出图片就可以了,但是用什么来保存这个图片呢?有些人可能说用NSDictionary(应该是NSMutableDictionary),因为这个类在开发中非常非常常用.但是其实可能有一个更好的选择,是专门为缓存来设计的,没错,就是NSCache.非常牛逼的AFN.SDWebImage都是用它来进行图片缓存的. 就像上边说到的,N

C# Ping 简单使用

编程过程中,有时候需要判断主机是否在线,最简单的方法就是使用Windows的Ping命令看看能否ping通.看到网上很多文章,说用C#去调用windows的ping.exe,然后解析返回的字符串.我觉得这种方式太麻烦了,就做一下简单判断,不想弄那么麻烦. 查了一下,C#专门提供了一个Ping类,与Windows下的ping命令类似: 命令空间: System.Net.NetworkInformation; 使用方法: bool online = false; //是否在线 Ping ping =