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 、直接判等

内存标识:

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

总结

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

(0)

相关推荐

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

    前言 本文主要给大家介绍了关于iOS集合弱引用对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1. 使用 NSValue NSValue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用. NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)]; [array addObject:value]; 2. 使用 NSPointerArray,NSMapTable,NSHash

  • iOS中的类、元类以及isa示例详解

    前言 对于类相信大家都知道是什么,如果看过runtime的源码或者看过相关的文章对isa肯定也不陌生,不过元类(meta class)大家可能就比较陌生了.不过大家也不要担心,我会细细道来,让大家明白它到底是个什么东西. 先看一段大家非常熟悉的代码: Person *person = [[Person alloc] init]; 为什么Person类名就能调用到alloc方法吗?到底怎么找到了alloc的方法了呢? 1.首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现

  • 在vue中封装方法以及多处引用该方法详解

    步骤: 1.先建立一个文件,放你想封装的方法:然后导出: 部分代码: 注: 导出这个地方需要特别注意:如果是一个对象的话:export 对象:如果是一个函数的话:export { 函数 } 2.引入文件: 补充知识:vue uni-app 公共组件封装,防止每个页面重复导入 1.公共插件 实现目标,将公共组件或者网络请求直接在this中调用,不需要再页面引用 #例如网络请求 var _this = this; this.api.userInfo({ token: '' } #通用工具 _this

  • Python脚本开发中的命令行参数及传参示例详解

    目录 sys模块 argparse模块 Python中的正则表达式 正则表达式简介 Re模块 常用的匹配规则 sys模块 在使用python开发脚本的时候,作为一个运维工具,或者是其他工具需要在接受用户参数运行时,这里就可以用到命令行传参的方式,可以给使用者一个比较友好的交互体验. python可以使用 sys 模块中的 sys.argv 命令来获取命令行参数,其中返回的参数是一个列表 在实际开发中,我们一般都使用命令行来执行 python 脚本 使用终端执行python文件的命令:python

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • JavaScript 弱引用强引用底层示例详解

    目录 正文 1. 弱引用 2. 强引用 3. JavaScript 的垃圾收集 3.1 可达性 4. Set VS WeakSet 5. Map VS WeakMap 6. WeakMap 的应用 6.1 缓存 6.2 额外的数据存储 7. 小结 正文 内存和性能管理是软件开发的重要方面,也是每个软件开发人员都应该注意的方面.虽然弱引用很有用,但在 JavaScript 中并不经常使用.在 ES6 版本中,JavaScript 引入了 WeakSet 和 WeakMap. 1. 弱引用 与强引用

  • c++中为什么可以通过指针或引用实现多态详解

    引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以. 那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. 如果该类中存在虚函数的话,再多加一个指向虚函数列表指针-vptr. 例如声明如下两个类,并分别实例化两个对象,它们的内存分配大致如下:(vptr具体在什么位置,与编译器有关,大多数都在开始处) class base { public: virtual ~base() {}; virtual string

  • iOS中震动反馈(UIFeedbackGenerator)与系统震动详解

    Taptic Engine 先了解一个概念--Taptic Engine Taptic Engine 是苹果产品上推出的全新震动模块,该元件最早出现在 Apple Watch 中.iPhone 6s 和 iPhone 6s Plus 中,也同样内置了Taptic Engine,在设计上有所升级. Taptic Engine 振动模块为 Apple Watch 以及 iPhone 6s.iPhone 7 提供了 Force Touch 以及 3D Touch,不同的屏幕操作,可以感受到不同的振动触

  • iOS中设置网络超时时间+模拟的方法详解

    设置方法如下: 在封装的网络请求类里面如下设置 AFWEBAPI_REQUEST_TIMEOUT 这个参数为超时时间 #define AFWEBAPI_REQUEST_TIMEOUT 20 #pragma mark - 单例 & 构造函数 + (instancetype)sharedTools { static WXNetworkTools *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ i

  • 解析在.net中使用XSLT转换xml文档的示例详解

    XSL即可扩展的样式表文件. 可以格式化xml的显示,也可以将xml转换成需要的另一种格式.学习XSL必须熟悉XPath.XSL和XPath一样简单强大,容易学习.1. XSL既然可以格式化xml的显示样式,我们先来看如何在xml中引用xsl文件如下代码示例:<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="url.

随机推荐