标签:
简介:
它是缓存类,用法和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
标签:
原文地址:http://www.cnblogs.com/pengpengzhang/p/4813741.html