美文网首页
谈一谈NSCache

谈一谈NSCache

作者: 一切会变好 | 来源:发表于2020-08-18 16:36 被阅读0次

NSCache介绍

NSCache是苹果提供的一套缓存机制,与NSMutableDictionary可变字典的用法类似,常见于一些第三方库,比如AFNetworking,SDWebImage。

使用场景:通常用使用缓存来临时存储短时间使用但创建昂贵的对象,优化性能,避免这些对象的多次创建

NSCache和NSMutableDictionary的区别

1、NSCache是线程安全的,不需要加线程锁,而NSMutableDictionary线程不安全,多线程访问和操作,需要我们自己设置管理。

2、NSCache的内存由系统管理,当内存不足时,NSCache会自动释放内存。

3、NSCache可以设置缓存对象数量和占用的内存大小,当缓存超出了设置,会自动释放内存。

4、NSCache是Key-Value的数据结构,其中key是强引用,不实现NSCoping协议,作为key的对象不会被拷贝。

下面介绍NSCache的属性、方法、代理

属性

countLimit: 能够缓存对象的最大数量,默认值是0,没有限制(限制是不精/不严格的)。totalCostLimit: 设置缓存占用的内存大小(限制是不精/不严格的)。

evictsObjectsWithDiscardedContent: 是否回收废弃内容,默认YES。

方法

setObject: forKey: 缓存对象。

setObject: forKey: cost: 缓存对象,并指定key值对应的成本,用于计算缓存中所有对象的总成本。

objectForKey: 通过key获得缓存对象。

removeObjectForKey: 删除指定对象removeAllObjects: 删除所有缓存对象

代理(NSCacheDelegate)

willEvictObject: 缓存对象即将被清理时调用,一般开发者用来调试,不能在此方法中修改缓存

以下场景会被调用:

1、 removeObjectForKey

2、缓存对象超过NSCache的countLimit和otalCostLimit属性设置的限制

3、App进入后台

4、系统发出内存警告

5、cache这个实例的生命周期结束前

NSCache注意点

1、当收到内存警告,而我们又调用removeAllObjects,则无法再继续往缓存中添加数据。

-(void)didReceiveMemoryWarning{

[super didReceiveMemoryWarning];

// 当收到内存警告,在这里清除缓存

[self.cache removeAllObjects];

// 如果再继续添加数据的话 会直接被删除

}

2、不提供缓存总的大小,想知道NSCache占用的内存大小,只有通过添加缓存的cost自己计算。

3、NSCache自动释放内存的算法是不确定的, 有时是按照LRU(最近最久未使用)释放,有时随机释放。

4、NSCache中的数据在APP重启后会消失,因为NSCache只是将数据保存在内存。

相关文章

网友评论

      本文标题:谈一谈NSCache

      本文链接:https://www.haomeiwen.com/subject/gjdkjktx.html