Weak Collections & NSCache

最常见最优秀的Cocoa集合是NSArray,NSSetNSDictionary.但是在某些情况时是不适合的.NSArrayNSSet会对里面的对象retain.NSDictionary不仅会retain存入的值,而且还会copy他的key.这些行为通常正是你想要的,但是对于某些问题来说,这样对你是不利的.幸运的是,其他的集合已经在iOS6中生效了:NSPointerArray,NSHashTableNSMapTable.它们在苹果的文档内被统称为指针集合类,并且有时使用NSPointerFunctions类来配置.

NSPointerArray类似于NSArray,NSHashTable类似于NSSet,还有NSMapTable类似于NSDictionary.不管是这些中的哪一种新集合类都可以被配置成弱引用,非对象指针,或者其他的非常用状况.NSPointerArray额外的好处就能够存储NULL值,这个在NSArray时代是一个普遍的问题.

苹果文件关于指针集合类的通常是指的是垃圾回收,因为这些类最初被开发来垃圾回收是在10.5中.这些类现在使用ARC弱引用编译.这些并不是总是清晰的在主类引用中,但是结果表明在NSPointerFunctions类引用中.

指针集合类能广泛的使用一个NSPointerFunctions对象来配置,但是大多数情况下,它类似于通过一个NSPointerFunctionsOptions标记到–initWithOptions:方法.最常见的情况如:+weakObjectsPointerArray,有它自己的构造函数.

有关更多信息,请参见相应的类文档Collections Programming Topics.还有个NSHipster的文章“NSHashTable & NSMapTable”. 网上找的中文翻译版;

NSCache

一个最常见使用弱集合的原因就是实现一个缓存功能.不过,在大多数情况下,你可以使用基础缓存对象NSCache来代替.大多数情况使用起来就像NSDictionary..调用objectForKey:,setObject:forKey: removeObjectForKey:.

NSCache有许多被忽视的特性,比如它是线程安全的.你可以在任何线程修改NSCache而不需要锁.NSCache的目的也是在于集成对象并符合<NSDiscardableContent>协议.最常见的符合<NSDiscardableContent>协议的一种类型是NSPurgeableData.当调用beginContentAccessendContentAccess时,你可以控制它安全的丢弃这个对象.这不仅在你APP运行的时候提供了自动缓存管理,它甚至能在APP暂停的时候帮忙.通常情况下,当内存紧张和内存警告后没有释放出足够的空间时,iOS开始杀死后台暂停程序.在这种情况下,你的APP不会收到代理消息.它就是被这么干掉了.但是假如你使用了NSPurgeableData,iOS为你释放这个内存,甚至当你被暂停时.

更多消息,请查看NSCache,<NSDiscardableContent>,NSPurgeableData的相关文档.