iOS 中集合如何弱引用对象
Mar 8, 2017
1. 使用 NSValue
NSValue
可以弱引用保存一个对象,我们可以使用这种方法间接的引用。
1 | NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)]; |
2. 使用 NSPointerArray,NSMapTable,NSHashTable
以上三个类型的用法分别对应 NSMutableArray
,NSMutableDictionary
,NSMutableSet
。
NSPointerArray
NSPointerArray
和 NSMutableArray
一样同是有序可变集合,可插入、删除成员;
不同的是可以存储 NULL
,且 count
可变,用 NULL
来填充。
1 | // 实例化方法 |
NSPointerFunctionsOptions
枚举定义着内存管理策略、方法特性和内存标识,以下是几个常用的枚举值:
- 内存管理策略:
NSPointerFunctionsStrongMemory
:强引用成员NSPointerFunctionsMallocMemory
与NSPointerFunctionsMachVirtualMemory
: 用于 Mach 的 虚拟内存管理NSPointerFunctionsWeakMemory
:弱引用成员
- 方法特性:
NSPointerFunctionsObjectPersonality
:hash、isEqual、对象描述NSPointerFunctionsOpaquePersonality
:pointer 的 hash 、直接判等
- 内存标识:
NSPointerFunctionsCopyIn
添加成员时进行 copy 操作
选用多种组合方式:
1 | NSPointerFunctionsOptions options = NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality | NSPointerFunctionsCopyIn; |
1 | static BOOL IsEqual(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { |
NSMapTable
NSMapTable
和 NSPointerArray
的初始化方法和使用都类似,不同的是 NSMapTable
的 key 和 object 各有不同的策略,所以有四种组合:
key | object |
---|---|
weak | weak |
strong | weak |
weak | strong |
strong | strong |
如果 key 或者 object 是 weak
修饰时,任意一方在内存中被释放都会移除该键值对。
NSHashTable
NSHashTable
使用方法类似于 NSMutableSet
,只不过该类型的 allObjectes
属性返回的是一个 NSArray
,会对成员强引用。
3. 根据 NSValue 的思路自己写一个类
新建一个 WeakRef
类:
1 | @interface WeakRef : NSObject |
使用:
1 | WeakRef *weakRef = [WeakRef new]; |
4. 根据 NSValue 的思路自己写一个 block
声明和定义一个 block:
1 | typedef id(^WeakRefBlock)(); |
使用:
1 | [array addObject:makeWeakRef([NSObject new])]; |