1. 使用 NSValue

NSValue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用。

NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)];
[array addObject:value];
复制代码

2. 使用 NSPointerArray,NSMapTable,NSHashTable

以上三个类型的用法分别对应 NSMutableArrayNSMutableDictionaryNSMutableSet

NSPointerArray

NSPointerArrayNSMutableArray 一样同是有序可变集合,可插入、删除成员; 不同的是可以存储 NULL,且 count 可变,用 NULL 来填充。

// 实例化方法
- (instancetype)initWithOptions:(NSPointerFunctionsOptions)options;
- (instancetype)initWithPointerFunctions:(NSPointerFunctions *)functions;
复制代码

NSPointerFunctionsOptions 枚举定义着内存管理策略、方法特性和内存标识,以下是几个常用的枚举值:

  1. 内存管理策略:

    • NSPointerFunctionsStrongMemory:强引用成员
    • NSPointerFunctionsMallocMemoryNSPointerFunctionsMachVirtualMemory: 用于 Mach 的 虚拟内存管理
    • NSPointerFunctionsWeakMemory:弱引用成员
  2. 方法特性:
    • NSPointerFunctionsObjectPersonality:hash、isEqual、对象描述
    • NSPointerFunctionsOpaquePersonality:pointer 的 hash 、直接判等
  3. 内存标识:
    • 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

NSMapTableNSPointerArray 的初始化方法和使用都类似,不同的是 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])];
复制代码

我的博客:iosgg.cn/

iOS 中集合如何弱引用对象相关推荐

  1. 当弱引用对象成为集合元素时

    当我们在系统用到某些占用内存较多的大对象,且该对象并不会被频繁使 用(例如缓存场景)时,考虑性能因素,或许我们可以选择使用弱引用(WeakReference)对象.弱引用对象就像是对象之中的" ...

  2. 记生产一次弱引用对象引起的空指针异常

    WeakReference如字面意思,弱引用, 当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果这时GC运行, ...

  3. java中的WeakReference(弱引用)

    java中的weakReference-弱引用 1.介绍 阅读ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞明白Thread ...

  4. java 弱引用 集合_java 弱引用集合类WeakHashMap

    java 弱引用集合类WeakHashMap Java集合框架中的WeakHashMap类是Map接口的一种特殊实现.它实现了Map接口,继承了AbstractMap抽象类.它实现了对key的弱引用. ...

  5. 【网易游戏面试题】.NET中强引用和弱引用是什么

    本文首发公众号洪流学堂.洪流学堂,让你快人几步. 今天分享一个网易游戏的面试题: 题目 请简述强引用和弱引用. 参考答案 我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不 ...

  6. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  7. 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)

    在使用python脚本和底层C++对象进行交互的过程中发生了一个问题:由于底层C++对象的创建和删除决定权由底层决定,当底层决定删除这些对象而上层仍然在"强引用"这些对象的时候,就 ...

  8. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  9. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

最新文章

  1. Oracle优化01-引起数据库性能问题的因素
  2. 计算机二级考试3月时间安排,2017年3月份计算机二级考试时间安排
  3. 三大主流软件负载均衡器(LVS、Nginx、HAproxy) 与商业SLB比较
  4. html css盒子顶层,HTML学习之四CSS盒子
  5. 网络请求的基本知识《极客学院 --AFNetworking 2.x 网络解析详解--1》学习笔记...
  6. 解决gdal集成libkml的链接错误
  7. docker安装redis并将配置文件和数据文件映射到外部
  8. 分类和目标检测的性能评价指标【转载】
  9. 断言java_Java几种常用的断言风格你怎么选?
  10. (91)FPGA时钟分频与倍频问题,面试必问(十五)(第19天)
  11. Android开发笔记(七)初识Drawable
  12. oracle的redo和undo,Oracle的redo 和undo的區別
  13. jenkins, docker-composer
  14. GraphEmbedding - Node2vec 图文详解
  15. 电脑登录宽带怎么自动连接服务器地址,宽带自动连接怎么设置
  16. 【FinE】单利与复利
  17. Mac Androidstudio点击打开跳一下就消失
  18. leyou商城day10 MQ介绍及详情静态页
  19. c语言猜单词游戏实验报告,猜单词游戏c语言源程序.doc
  20. python求表面积代码_用于计算python中的体积或表面积的良好算法

热门文章

  1. Value of type “string“ is not suitable for value type “Numeric (float)“. Value “Traceback (most rece
  2. PC ACCESS 客户端测试出现错误
  3. 光的散射、反射、漫反射的区别
  4. rabbitmq和springboot实现智能家居远程控制
  5. LOJ2687 BOI2013Vim 题解
  6. 微信小程序提交审核并发布详细流程(一)
  7. Excel 多列变一列(亲自实践)
  8. 数据库死锁及解决办法
  9. TX2--TX2介绍
  10. 关于app#启动页面#splash页面#开屏广告#的小结