OSCache 是一个开源的 NSCache
重新实现,其行为可预测、可调试。 OSCache 是一个 LRU(最少最近使用)缓存,这意味着对象将根据最后一次访问时间最早被丢弃。在内存警告的情况下,OSCache 将会自动清空。
OSCache 继承自 NSCache
以便方便使用(以便更容易地作为即插即用替换),但不依赖于任何继承的行为。
OSCache 实现 NSCache
的所有方法,但当前不支持任何与 NSDiscardableContent
相关的功能,并且会始终返回 NO
对于 evictsObjectsWithDiscardedContent
,不管您设置其为多少。
注意:“支持”意味着库已与该版本进行了测试。“兼容”意味着库应在该 OS 版本上工作(即它不依赖于任何不可用的 SDK 功能),但不再测试兼容性,可能需要调整或错误修正才能正确运行。
OSCache 需要 ARC。如果您希望在非 ARC 项目中使用 OSCache,只需将 -fobjc-arc
编译器标志添加到 OSCache.m
类。为此,请转到目标设置中的“构建阶段”选项卡,打开“编译来源”组,在列表中选择 OSCache.m
并输入 -fobjc-arc
到弹出窗口中。
如果您希望将整个项目转换为 ARC,请取消注释 OSCache.m
中的 #error
行,然后在 Xcode 中运行“编辑”>“重构”>“转换为 Objective-C ARC...”工具,并确保检查您希望使用 ARC 的所有文件(包括 OSCache.m
)。
要将 OSCache 安装到您的应用程序中,将 OSCache.h
和 .m
文件拖放到您的项目中。创建并使用 OSCache
实例,就像您使用正常的 NSCache
一样。
除了所有继承的NSCache方法外,OSCache还增加了以下方法:
@property (nonatomic, readonly) NSUInteger count;
缓存中当前存储的项目总数;
@property (nonatomic, readonly) totalCost;
缓存中当前所有项目的总成本;
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block;
枚举缓存中存储的键和值。
OSCache的代理现在实现OSCacheDelegate
协议,它是NSCacheDelegate
的超集。您可以将您的代理声明为支持OSCacheDelegate
或NSCacheDelegate
协议;两种方式都不会出现警告。
OSCacheDelegate
增加了以下可选方法
- (BOOL)cache:(OSCache *)cache shouldEvictObject:(id)entry;
在缓存对象从缓存中移除之前,该方法会被调用,使您有机会撤销移除操作。您可以使用此方法实现自己的缓存清除标准(例如,您可以选择只在另一个缓存已经为空的情况下才清空缓存)。
仅在向缓存中添加项目或在内存警告发生时调用此方法;如果您显式使用-removeObjectForKey:
或-removeAllObjects
删除对象,则不会调用。对象的移除将始终按照最近最少使用顺序进行。
当缓存仍有空间时,读取、写入和删除条目具有恒定时间(O(1))。当缓存已满时,插入时间降级为线性(O(n)),但读取和删除仍然是恒定的。
因此,您应该理想地为您的大小进行缓存,以便它永远不会填满,但如果那不可能,选择更小的容量更好,因为当它们填满时,非常大的大小会导致性能显著下降。
版本 1.2.1
enumerateKeysAndObjectsUsingBlock:
返回内部包装而不是缓存对象的错误。版本 1.2
版本 1.1.2
版本 1.1.1
版本 1.1
-count
和-totalCost
属性。OSCacheDelegate
协议,它是NSCacheDelegate
的超集。-cache:shouldEvictObject:
代理方法。-cache:shouldEvictObject:
和-cache:willEvictObject:
。NSLock
而不是dispatch_semaphore
(更合适)。OSCache
仍然像继承自NSCache
一样表现,但实际上不再如此,以避免Apple在未来更改NSCache
实现时可能产生的破坏。版本 1.0