NSCache

reference doc NSCache


SDKs

iOS 4.0+
macOS 10.6+
tvOS 9.0+
watchOS 2.0+

class

NSCache

A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low.
是一个可变集合,可用于临时存储瞬态键值对,当接收到系统资源快要耗尽是会执行删减已存储的瞬态键值对的行为。

Overview

Cache objects differ from other mutable collections in a few ways:

  • The NSCache class incorporates various auto-eviction policies, which ensure that a cache doesn’t use too much of the system’s memory. If memory is needed by other applications, these policies remove some items from the cache, minimizing its memory footprint.
  • You can add, remove, and query items in the cache from different threads without having to lock the cache yourself.
  • Unlike an NSMutableDictionary object, a cache does not copy the key objects that are put into it.

以下是 Cache 与 其他可变集合的区别:

  • NSCache 类结合了各种自动回收策略,Cache 实例不会对系统内存造成过多的压力。如果系统的其他应用也需要内存分配时,NSCache 就会按照给定的回收策略移除存放的项目,尽量减少它的内存占用。
  • NSCache是线程安全的,你可以在不同的线程内对 NSCache 实例进行增、删、查等操作。
  • 与NSMutableDictionary对象不同的是,NSCache实例是不会对存放进来的键值对执行 copy 操作。

You typically use NSCache objects to temporarily store objects with transient data that are expensive to create. Reusing these objects can provide performance benefits, because their values do not have to be recalculated. However, the objects are not critical to the application and can be discarded if memory is tight. If discarded, their values will have to be recomputed again when needed.
每次都通过创建新的 NSCache 对象来临时存储瞬态数据的性能消耗是比较高的。而重用已创建的NSCache 对象则有益于性能的提升,因为可以不再对已存储的值所要占用的内存进行重新计算。需要注意的是,如果这些存放的值被移除时对应用不能有任何影响,因为当内存发生警告这些对象就会被移除,移除后的值如果再被调用的话则会进行重新计算。

question:当内存警告发生时,是 NSCache 对象被移除?还是里面已经存放的值被移除?假设移除了值,那么还能重新获取该值吗?

Objects that have subcomponents that can be discarded when not being used can adopt the NSDiscardableContent protocol to improve cache eviction behavior. By default, NSDiscardableContent objects in a cache are automatically removed if their content is discarded, although this automatic removal policy can be changed. If an NSDiscardableContent object is put into the cache, the cache calls discardContentIfPossible on it upon its removal.
如果Cache存放的一些具有 subcomponents 且可被废弃的对象时,当该对象未被使用的话,可以让对象通过遵守NSDiscardableContent协议来提升 Cache 的释放行为性能。默认情况下,遵守NSDiscardableContent协议的对象在它的 Content 被废弃后会自动地被 Cache 实例移除,即使改变 Cache 的自动移除策略,该行为同样会执行。当Cache 缓存了遵守NSDiscardableContent协议的对象时,Cache 实例会调用该对象实现的NSDiscardableContent协议的方法discardContentIfPossible,当该对象被移除时

NSCache.h

#import <Foundation/NSObject.h>

@class NSString;
@protocol NSCacheDelegate;

NS_ASSUME_NONNULL_BEGIN

NS_CLASS_AVAILABLE(10_6, 4_0)
@interface NSCache <KeyType, ObjectType> : NSObject {
@private
    id _delegate;
    void *_private[5];
    void *_reserved;
}

@property (copy) NSString *name;

@property (nullable, assign) id<NSCacheDelegate> delegate;

- (nullable ObjectType)objectForKey:(KeyType)key;
- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;
- (void)removeObjectForKey:(KeyType)key;

- (void)removeAllObjects;

@property NSUInteger totalCostLimit;    // limits are imprecise/not strict
@property NSUInteger countLimit;    // limits are imprecise/not strict
@property BOOL evictsObjectsWithDiscardedContent;

@end

@protocol NSCacheDelegate <NSObject>
@optional
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
@end

NS_ASSUME_NONNULL_END

Topics


设置 Cache 实例的名字

name
默认值是空字符串@“”;


限制缓存大小

countLimit
最大缓存个数;
默认值为0,当值为0时候即表示没有个数限制;
这不是一个严格的限制值,如果缓存超过countLimit所设定的值,已存在缓存中的某个对象,默认的情况下会被马上移除,但实际上可能稍后移除,也有可能不移除。这些都取决于 Cache 内部实现。

totalCostLimit
在执行清除缓存动作前,缓存支持的最大缓存成本值。
默认值为0,为0则表示不设限制。
如果你添加到缓存内的对象,刚好超出了你指定的totalCostLimit值(缓存总成本),那么缓存会自动地执行释放已缓存对象操作,直到可以缓存下你添加的对象同时整个缓存成本低于你指定的totalCostLimit值。需要注意的是,释放已缓存对象的顺序是不确定的。

totalCostLimit同样不是一个严格的限制值,如果缓存超过totalCostLimit所设定的值,已存在缓存中的某个对象,默认的情况下会被马上移除,但实际上可能稍后移除,也有可能不移除。这些都取决于 Cache 内部实现。


Ref
iOS系统中缓存的使用
这个基本上是参考 52个高效方法的内容描述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 今天研究SDWebimage发现,里面使用了NSCache的一个方法setObject:forKey:cost:首...
    RealSlimAlan阅读 2,362评论 1 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,718评论 0 9
  • 打算了解一下NSCache可能要从前一段时间面试讲起,当时面试者问我了解NSCache吗?我的第一印象是:这是什么...
    Arnold134777阅读 6,008评论 1 25
  • 又是新的一年,每年都会计划,可每年没有改变,就这样度过毕业5年,有一个对社会懵懵懂懂的女孩子,变成了现在职场的一员...
    小太阳的碎碎念阅读 147评论 0 0