当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS中的集合该如何弱引用对象示例详解

iOS中的集合该如何弱引用对象示例详解

2019年07月24日  | 移动技术网移动技术  | 我要评论

前言

本文主要给大家介绍了关于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 、直接判等

内存标识:

  1. 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])];

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网