【Objective-C】NSMapTable、NSHashTable与NSPointerArray

学习文章

简单介绍

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

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

// 存
[NSValue valueWithNonretainedObject:model]

// 取
value.nonretainedObjectValue  

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

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

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

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

来指定对象持有方式.

也可以用初始化方法

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

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

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

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

下载源码

WeakList

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容