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])];
复制代码
我的博客:iosgg.cn/
iOS 中集合如何弱引用对象相关推荐
- 当弱引用对象成为集合元素时
当我们在系统用到某些占用内存较多的大对象,且该对象并不会被频繁使 用(例如缓存场景)时,考虑性能因素,或许我们可以选择使用弱引用(WeakReference)对象.弱引用对象就像是对象之中的" ...
- 记生产一次弱引用对象引起的空指针异常
WeakReference如字面意思,弱引用, 当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果这时GC运行, ...
- java中的WeakReference(弱引用)
java中的weakReference-弱引用 1.介绍 阅读ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞明白Thread ...
- java 弱引用 集合_java 弱引用集合类WeakHashMap
java 弱引用集合类WeakHashMap Java集合框架中的WeakHashMap类是Map接口的一种特殊实现.它实现了Map接口,继承了AbstractMap抽象类.它实现了对key的弱引用. ...
- 【网易游戏面试题】.NET中强引用和弱引用是什么
本文首发公众号洪流学堂.洪流学堂,让你快人几步. 今天分享一个网易游戏的面试题: 题目 请简述强引用和弱引用. 参考答案 我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不 ...
- 理解Java中的弱引用(Weak Reference)
理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...
- 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)
在使用python脚本和底层C++对象进行交互的过程中发生了一个问题:由于底层C++对象的创建和删除决定权由底层决定,当底层决定删除这些对象而上层仍然在"强引用"这些对象的时候,就 ...
- java的弱引用_深入理解Java中的弱引用
不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...
- java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用
十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...
最新文章
- Oracle优化01-引起数据库性能问题的因素
- 计算机二级考试3月时间安排,2017年3月份计算机二级考试时间安排
- 三大主流软件负载均衡器(LVS、Nginx、HAproxy) 与商业SLB比较
- html css盒子顶层,HTML学习之四CSS盒子
- 网络请求的基本知识《极客学院 --AFNetworking 2.x 网络解析详解--1》学习笔记...
- 解决gdal集成libkml的链接错误
- docker安装redis并将配置文件和数据文件映射到外部
- 分类和目标检测的性能评价指标【转载】
- 断言java_Java几种常用的断言风格你怎么选?
- (91)FPGA时钟分频与倍频问题,面试必问(十五)(第19天)
- Android开发笔记(七)初识Drawable
- oracle的redo和undo,Oracle的redo 和undo的區別
- jenkins, docker-composer
- GraphEmbedding - Node2vec 图文详解
- 电脑登录宽带怎么自动连接服务器地址,宽带自动连接怎么设置
- 【FinE】单利与复利
- Mac Androidstudio点击打开跳一下就消失
- leyou商城day10 MQ介绍及详情静态页
- c语言猜单词游戏实验报告,猜单词游戏c语言源程序.doc
- python求表面积代码_用于计算python中的体积或表面积的良好算法
热门文章
- Value of type “string“ is not suitable for value type “Numeric (float)“. Value “Traceback (most rece
- PC ACCESS 客户端测试出现错误
- 光的散射、反射、漫反射的区别
- rabbitmq和springboot实现智能家居远程控制
- LOJ2687 BOI2013Vim 题解
- 微信小程序提交审核并发布详细流程(一)
- Excel 多列变一列(亲自实践)
- 数据库死锁及解决办法
- TX2--TX2介绍
- 关于app#启动页面#splash页面#开屏广告#的小结