学习文章
简单介绍
即使有了 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对弱引用的封装.
网友评论