NSCache(2012)

2020-09-08 13:15:41

可怜的NSCache,总是被NSMutable Dictionary盖过风头。似乎没有人知道它是如何提供所有垃圾收集行为的,开发人员费尽心思重新实现了这些行为。

没错:NSCache基本上只是一个NSMutable Dictionary,它自动清除对象,以便根据需要释放内存空间。无需响应内存警告或设计缓存清除计时器机制。唯一的另一个区别是键不会像在NSMutable Dictionary中那样被复制,这实际上是它的优势(不需要键符合<;NSCopying>;)。

但你和其他开发人员不一样,对吧?你不会忽视NSCache的,是吗?

这并不是说没有一些疣和令人费解的警告-远非如此。NSCache是一种炙手可热的乱七八糟的东西。

以Set Object:For Key:Cost:为例。它与前面的set object:for key:method相同,但具有此成本参数。你会问,那是什么?嗯,即使是文档也不是很确定:

成本值用于计算包含高速缓存中所有对象的成本的总和。当内存有限或高速缓存的总成本超过允许的最大总成本时,高速缓存可以开始逐出过程以删除其某些元素。

然而,这一驱逐过程并不是有保障的。因此,如果您试图操纵成本值来实现某些特定的行为,结果可能会对您的程序有害。

通常,明显的开销是以字节为单位的值的大小。如果该信息不是现成的,您就不应该费力地计算它,因为这样做会增加使用高速缓存的成本。

等等,什么是不明显的成本价值?对于内存限制应该是什么,有什么指导原则吗?甚至一个数量级怎么样?“随意猜测错误并遭受糟糕的表现”听起来并不是那么有说服力的…。

如果没有其他有用的东西可以传递,则传入0作为成本值,或者简单地使用setObject:Forkey:方法,该方法不需要传入成本值。

阅读:除非你在苹果公司工作,并且认识原作者,否则不要使用这种方法。

还有一个完整的部分是关于控制是否使用带有丢弃内容的Eicts对象自动驱逐对象&;<;NSDiscarable Content>;,但这可能只会给您带来更多问题。

尽管如此,开发人员使用NSCache的次数应该比现在多得多。项目中您称之为“缓存”但不是NSCache的任何东西都将是替换的主要候选对象。但如果您这样做了,只需确保使用Classics:OBJECT FOR KEY:,为KEY:设置OBJECT:,&;Remove Object For Key:。

还没被说服?作为临别礼物,我们甚至会让它变得更容易,通过一个小小的订阅障碍:

扩展NSCache{下标(key:any object)->;任何对象?{get{key(Key)}return object?}set{if letvalue:any object=new value{set object(value,for key:key)}Else{删除key(Key)的对象}。

注:由于SWIFT 3中Objective-C泛型的更改,上面给出的下标仅在SWIFT 2.3及更早版本中有效。

本文使用SWIFT版本2.2,最后一次审阅是在2016年4月10日。在“状态”页上查找所有文章的状态信息。

排序:它是计算机科学101考试和白板面试问题的中流砥柱。但是您最后一次真正需要知道如何自己实现快速排序是什么时候呢?