这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
NSCache
NSCache 是苹果官方提供的缓存类,用法与NSMutableDictionary
的用法很相似,在AFNetworking
和SDWebImage
中,使用它来管理缓存
- 当系统资源将要耗尽时,它可以自动删除缓存( NSCache 会先行删减“最久未使用的”对象,)
- NSCache 并不会拷贝
key
,而是会保留它,因为大多数key
值都是由不支持拷贝的对象来充当的 - NSCache 是线程安全的,在多线程操作中,不需要对
Cache
加锁
NSCache的属性
countLimit
:能够缓存对象的最大数量,默认值是0
(没有限制)totalCostLimit
:缓存空间的最大成本,超出上限会自动回收对象。默认值是0
(没有限制)- 当超出缓存最大成本或数量时,NSCache 会把前面的数据即最开始存的给清除掉
evictsObjectsWithDiscardedContent
:表示是否回收废弃的内容,默认值是YES
(自动回收)
NSCache的方法
objectForKey:
:返回与键值关联的对象setObject: forKey:
: 在缓存中设置指定键名对应的值。与可变字典不同的是,缓存对象不会对键名做copy
操作setObject: forKey: cost:
: 在缓存中设置指定键名对应的值,并且指定该键值对的成本。成本cost
用于计算记录在缓冲中所有对象的总成本。当出现内存警告,或者超出缓存的成本上限时,缓存会开启一个回收过程,删除部分元素removeObjectForKey
:删除缓存中指定键名的对象removeAllObjects
:删除缓存中的所有对象
委托方法
cache: willEvictObject:
: 缓存将要删除对象时调用,不能在此方法中修改缓存。仅仅用于后台的打印,以便于调试
#import "ViewController.h"
@interface ViewController()<NSCacheDelegate>
@property (nonatomic, strong) NSCache *myCache;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for (int i =0 ; i< 5; i++) {
// 向缓存中添加对象
NSString *str = [NSString stringWithFormat:@"cache - %d", I];
[self.myCache setObject:str forKey:@(i)];
}
for (int i=0 ; i< 5; i++) {
NSLog(@"%@", [self.myCache objectForKey:@(i)]);
}
}
-(NSCache *)myCache
{
if (_myCache == nil) {
_myCache = [[NSCache alloc] init];
_myCache.countLimit = 3;
_myCache.delegate = self;
}
return _myCache;
}
#pragma mark- delegate
-(void)cache:(NSCache *)cache willEvictObject:(id)obj
{
NSLog(@"要删除的对象obj-------------%@", obj);
}
@end
NSPurgeableData
-
NSMutableData
的子类,且实现了NSDiscardableContent
协议 -
当系统资源紧张时,可以把保存
NSPurgeableData
对象的那块内存释放掉 -
调用
beginContentAccess
,说明现在还不应丢弃NSPurgeableData
所占的内存 -
调用
endContentAccess
,说明在必要时可以丢弃NSPurgeableData
所占的内存 -
beginContentAccess
与endContentAccess
类似引用计数的方式,当对象的“引用计数”为0
才可以被丢弃 -
如果缓存使用得当,那么应用程序的响应速度就能提高,只有那种“只要计算起来很难费事的”数据,才值得放入缓存,比如那些需要从网络获取或从磁盘读取的数据。