iOS中的集合该如何弱引用对象示例详解
前言
本文主要给大家介绍了关于iOS集合弱引用对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
1.使用NSValue
NSValue可以弱引用保存一个对象,我们可以使用这种方法间接的引用。
NSValue*value=[NSValuevalueWithNonretainedObject:@selector(class)]; [arrayaddObject:value];
2.使用NSPointerArray,NSMapTable,NSHashTable
以上三个类型的用法分别对应NSMutableArray,NSMutableDictionary,NSMutableSet。
NSPointerArray
NSPointerArray和NSMutableArray一样同是有序可变集合,可插入、删除成员;不同的是可以存储NULL,且count可变,用NULL来填充。
//实例化方法 -(instancetype)initWithOptions:(NSPointerFunctionsOptions)options; -(instancetype)initWithPointerFunctions:(NSPointerFunctions*)functions;
NSPointerFunctionsOptions枚举定义着内存管理策略、方法特性和内存标识,以下是几个常用的枚举值:
内存管理策略:
- NSPointerFunctionsStrongMemory:强引用成员
- NSPointerFunctionsMallocMemory与NSPointerFunctionsMachVirtualMemory:用于Mach的虚拟内存管理
- NSPointerFunctionsWeakMemory:弱引用成员
方法特性:
- NSPointerFunctionsObjectPersonality:hash、isEqual、对象描述
- NSPointerFunctionsOpaquePersonality:pointer的hash、直接判等
内存标识:
- NSPointerFunctionsCopyIn添加成员时进行copy操作
选用多种组合方式:
NSPointerFunctionsOptionsoptions=NSPointerFunctionsStrongMemory|NSPointerFunctionsObjectPersonality|NSPointerFunctionsCopyIn; NSHashTable*table=[NSHashTablehashTableWithOptions:options];
staticBOOLIsEqual(constvoid*item1,constvoid*item2,NSUInteger(*size)(constvoid*item)){ return*(constint*)item1==*(constint*)item2; } NSPointerFunctions*functions=[[NSPointerFunctionsalloc]init]; [functionssetIsEqualFunction:IsEqual];
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类:
@interfaceWeakRef:NSObject @property(nonatomic,weak)idref; @end
使用:
WeakRef*weakRef=[WeakRefnew]; weakRef.ref=xxx; [arrayaddObject:weakRef];
4.根据NSValue的思路自己写一个block
声明和定义一个block:
typedefid(^WeakRefBlock)(); typedefid(^MakeWeakRefBlock)(id); MakeWeakRefBlockmakeWeakRef(idobject){ __weakidweakref=object; WeakRefBlockblock=^(){ returnweakref; }; returnblock; }
使用:
[arrayaddObject:makeWeakRef([NSObjectnew])];
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。