欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-18 15:34:22
前言 本文主要给大家介绍了关于ios集合弱引用对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 1. 使用 nsvalue nsv...

前言

本文主要给大家介绍了关于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])];

总结

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

上一篇:

下一篇: