OSCache 1.2.1

OSCache 1.2.1

测试测试过
语言语言 Obj-CObjective C
许可证 zlib
发布日期最新发布2015年12月

Nick Lockwood 维护。



OSCache 1.2.1

  • 作者:
  • Nick Lockwood

目的

OSCache 是一个开源的 NSCache 重新实现,其行为可预测、可调试。 OSCache 是一个 LRU(最少最近使用)缓存,这意味着对象将根据最后一次访问时间最早被丢弃。在内存警告的情况下,OSCache 将会自动清空。

OSCache 继承自 NSCache 以便方便使用(以便更容易地作为即插即用替换),但不依赖于任何继承的行为。

OSCache 实现 NSCache 的所有方法,但当前不支持任何与 NSDiscardableContent 相关的功能,并且会始终返回 NO 对于 evictsObjectsWithDiscardedContent,不管您设置其为多少。

支持的操作系统和 SDK 版本

  • 支持的构建目标 - iOS 9.1 / tvOS 9.1 / Mac OS 10.11 (Xcode 7.1, Apple LLVM 编译器 7.1)
  • 最早支持的部署目标 - iOS 7.0 / tvOS 9.0 / Mac OS 10.10
  • 最早兼容的部署目标 - iOS 4.3 / tvOS 9.0 / Mac OS 10.6

注意:“支持”意味着库已与该版本进行了测试。“兼容”意味着库应在该 OS 版本上工作(即它不依赖于任何不可用的 SDK 功能),但不再测试兼容性,可能需要调整或错误修正才能正确运行。

ARC 兼容性

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;

枚举缓存中存储的键和值。

OSCacheDelegate

OSCache的代理现在实现OSCacheDelegate协议,它是NSCacheDelegate的超集。您可以将您的代理声明为支持OSCacheDelegateNSCacheDelegate协议;两种方式都不会出现警告。

OSCacheDelegate增加了以下可选方法

- (BOOL)cache:(OSCache *)cache shouldEvictObject:(id)entry;

在缓存对象从缓存中移除之前,该方法会被调用,使您有机会撤销移除操作。您可以使用此方法实现自己的缓存清除标准(例如,您可以选择只在另一个缓存已经为空的情况下才清空缓存)。

仅在向缓存中添加项目或在内存警告发生时调用此方法;如果您显式使用-removeObjectForKey:-removeAllObjects删除对象,则不会调用。对象的移除将始终按照最近最少使用顺序进行。

性能

当缓存仍有空间时,读取、写入和删除条目具有恒定时间(O(1))。当缓存已满时,插入时间降级为线性(O(n)),但读取和删除仍然是恒定的。

因此,您应该理想地为您的大小进行缓存,以便它永远不会填满,但如果那不可能,选择更小的容量更好,因为当它们填满时,非常大的大小会导致性能显著下降。

发行说明

版本 1.2.1

  • 修复了enumerateKeysAndObjectsUsingBlock:返回内部包装而不是缓存对象的错误。
  • 添加了轻量级泛型注解。

版本 1.2

  • 显著提高了缓存满时插入性能。
  • 修复了将私有容器对象传递给代理而不是缓存对象的错误。
  • 为缓存对象和键添加了枚举和访问方法。

版本 1.1.2

  • 添加了可空性注解。
  • 在Xcode 7中修复了可空性错误。
  • 修复了Xcode 6.3 + 7的单元测试。

版本 1.1.1

  • 修复了当从缓存中读取时发生溢出时序列号不会重排序的错误。

版本 1.1

  • 公开了-count-totalCost属性。
  • 添加了OSCacheDelegate协议,它是NSCacheDelegate的超集。
  • 添加了可选的-cache:shouldEvictObject:代理方法。
  • 如果由于内存警告而清除缓存,现在对每个项目调用-cache:shouldEvictObject:-cache:willEvictObject:
  • 现在使用序列号而不是时间来排序缓存项目(更可靠)。
  • 现在使用NSLock而不是dispatch_semaphore(更合适)。
  • OSCache仍然像继承自NSCache一样表现,但实际上不再如此,以避免Apple在未来更改NSCache实现时可能产生的破坏。
  • 添加了单元测试。

版本 1.0

  • 首次发布