iOS中的集合该如何弱引用对象示例详解
前言
本文主要给大家介绍了关于ios集合弱引用对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
1. 使用 nsvalue
nsvalue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用。
nsvalue *value = [nsvalue valuewithnonretainedobject:@selector(class)]; [array addobject: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 操作
选用多种组合方式:
nspointerfunctionsoptions options = nspointerfunctionsstrongmemory | nspointerfunctionsobjectpersonality | nspointerfunctionscopyin; nshashtable *table = [nshashtable hashtablewithoptions:options];
static bool isequal(const void *item1, const void *item2, nsuinteger (*size)(const void *item)) { return *(const int *)item1 == *(const int *)item2; } nspointerfunctions *functions = [[nspointerfunctions alloc] init]; [functions setisequalfunction: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 类:
@interface weakref : nsobject @property (nonatomic, weak) id ref; @end
使用:
weakref *weakref = [weakref new]; weakref.ref = xxx; [array addobject:weakref];
4. 根据 nsvalue 的思路自己写一个 block
声明和定义一个 block:
typedef id(^weakrefblock)(); typedef id(^makeweakrefblock)(id); makeweakrefblock makeweakref (id object) { __weak id weakref = object; weakrefblock block = ^(){ return weakref; }; return block; }
使用:
[array addobject:makeweakref([nsobject new])];
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读