【Objective-C】NSMapTable、NSHashTable与NSPointerArray

学习文章

  • NSMapTable、NSHashTable与NSPointerArray的封装
  • NSHashTable and NSMapTable

简单介绍

即使有了 ARC ,我们有时候也想更精准的控制一个对象的内存管理.我们在用例如 NSDictionary 这样的集合类的时候,它默认持有对象,但有时候,我们只想简单的保留一个对象的弱引用,这时候就会比较麻烦.

我们需要用NSValue的方法来保证引用计数不变:

// 存
[NSValue valueWithNonretainedObject:model]

// 取
value.nonretainedObjectValue  

上面的使用方式明显太麻烦了,这样,我们今天的主角就登场了. NSMapTable 对应 NSDictionary ; NSHashTable 对应 NSSet ; NSPointerArray 对应 NSArray .它们提供了对象内存管理的方式.

我们用NSPointerFunctionsOptions来初始化对象的持有方式,或者,用系统提供的相应的类方法.

如 NSMapTable 中,我们可以用类方法:

+ (NSMapTable *)strongToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0);
+ (NSMapTable *)weakToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0); // entries are not necessarily purged right away when the weak key is reclaimed
+ (NSMapTable *)strongToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0);
+ (NSMapTable *)weakToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0);  

来指定对象持有方式.

也可以用初始化方法

- (instancetype)initWithKeyOptions:(NSPointerFunctionsOptions)keyOptions
                      valueOptions:(NSPointerFunctionsOptions)valueOptions
                          capacity:(NSUInteger)initialCapacity  

选择枚举,来指定对象持有方式.

最后,我们将其封装成我们习惯的数组/字典/集合的使用方式.

下面,我们附下YouXianMing对弱引用的封装.

下载源码

WeakList

你可能感兴趣的:(【Objective-C】NSMapTable、NSHashTable与NSPointerArray)