iOS 中集合如何弱引用对象

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 各有不同的策略,所以有四种组合:

keyobject
weakweak
strongweak
weakstrong
strongstrong

如果 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值