NSCache

简介:

  它是缓存类,用法和NSMutableDictionary的用法相似,在AFNetworking和SDWebImage中,使用它来缓存。

  NSCache 在系统内存很低时候,会自动释放一些对象。----这句话是出自苹果官方文档,不过在模拟器中模拟内存警告时,缓存不会做清理动作,所以为了确保内存警告时候能够真正的释放内存,最好调用removeAllObjects方法。

  NSCache是安全的线程,在多线程中不需要对Cache加锁。

  NSCache的key知识做强引用,不需要实现NSCopying协议你。

属性:

  name

  delegate

  totalCostLimit  缓存空间的最大总成本,超出上限会自动回收对象。

          默认值 0 ,表示没有限制。

  countLimit      能够缓存对象的最大数量。

            默认值是 0 ,表示没有限制。

  evictsObjectsWithDiscatdedContent 标示缓存是否能回收废弃的内容。

                    默认值时 YES,表示自动回收。

方法:

  -objectForKey:返回与键值关联的对象。

  -setObject:forKey: 在缓存中设置指定键名对应的值。

            与可变自动不同,缓存对象不会对键名做copy操作

            0成本

  -setObject:forKey:cost: 在缓存中设置指定键名对应的值,并且制定该键值对的成本。

               成本(cost)用于计算纪录在缓冲中的所有对象的总成本。

              当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素。

  -removeObjectForKey: 删除缓存中,指定键名对象。

  -removeAllObjects 删除缓存中所有对象。

委托方法:

  -cache:willEvictObject: 缓存将要删除对象时候调用 

              不能在此方法中修改缓存。 

 

demo:

//

//  ViewController.m

//  09-NSCache演练

//

//  Created by jerry on 15/9/16.

//  Copyright (c) 2015年 jerry. All rights reserved.

//

/**

 *  代理三部曲,1.继承代理方法  <NSCacheDelegate> 2.设置代理 _myCache.delegate = self 3.实现方法。

 *

 */

#import "ViewController.h"

 

@interface ViewController ()<NSCacheDelegate>

@property(nonatomic,strong)NSCache *myCache;

@end

 

@implementation ViewController

 

-(NSCache *)myCache

{

    if (_myCache == nil) {

        _myCache = [[NSCache alloc]init];

//          NSUInteger totalCostLimit 成本限制。 默认 0 也就是不限制。

//          NSUInteger countLimit 数量限制,默认是 0  也就是不限制。

//        设置缓存对象,同时制定成本。

//        - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

        

        _myCache.countLimit = 30; // 限制数量。而且存的是最新的东西。

        

//        代理

        _myCache.delegate = self;

        

    }

    return _myCache;

}

/**

 *  这个方法主要用于程序员对程序的测试。

 *

 *  @param cache <#cache description#>

 *  @param obj   要删除的对象。在这里通知下代理方法。

 */

-(void)cache:(NSCache *)cache willEvictObject:(id)obj

{

    NSLog(@"%@",obj);

}

 

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    for (int i = 0 ; i<100; i++) {

//        向缓存中添加对象

        NSString *str = [NSString stringWithFormat:@"hello - %d",i];

        [self.myCache setObject:str forKey:@(i)];

    }

    

    for (int i = 0; i<100; i++) {

        NSLog(@"%@",[self.myCache objectForKey:@(i)]);

    }

}

 

@end

 

  

posted @ 2015-09-16 16:41  。低调ヽ继续  阅读(213)  评论(0编辑  收藏  举报