如何将弱引用对象存储在数组中,字典中的objc?

Posted

技术标签:

【中文标题】如何将弱引用对象存储在数组中,字典中的objc?【英文标题】:How to store weak reference object in array, dictionary in objc? 【发布时间】:2014-02-15 12:36:15 【问题描述】:

众所周知,当您将对象添加到数组 (NSMutableArray) 或字典 (NSMutableDictionary) 时,它会创建对该对象的强引用。

是否可以将对象添加到具有弱引用的数组中?

【问题讨论】:

【参考方案1】:

1.NSValue

+ (NSValue *)valueWithNonretainedObject:(id)anObject

如果您想将对象添加到集合但不希望集合创建对其的强引用,此方法很有用。

2. 使用块有一个棘手的方法:

typedef id (^WeakReference)(void);

WeakReference MakeWeakReference (id object) 
    __weak id weakref = object;
    return ^ return weakref; ;


id WeakReferenceNonretainedObjectValue (WeakReference ref) 
    if (ref == nil)
        return nil;
    else
        return ref ();


[arr addObject:MakeWeakReference(obj)];
id newobj = WeakReferenceNonretainedObjectValue([arr objectAtIndex:0]);

3.使用一个自定义的 WeakReference 类,该类持有指向该值的弱指针。


其实上述方法的设计思路都是一样的。

【讨论】:

更好的选择:NSPointerArray 如果使用 valueWithNonretainedObject,则 NSValue 将不包含 weak 引用,而是包含 nonretained object。如果对象被释放并且您访问该引用,则可能导致崩溃。 提示:使用[NSPointerArray weakObjectsPointerArray]【参考方案2】:

您可以使用NSValue valueWithNonretainedObject: 强存储弱引用目标对象的值。

【讨论】:

__weak typeof(object) weakObject = object; [NSMutableArray addObject:weakObject]; 等其他方法是否有效?或者[NSMutableArray addObject:(id)object]; @nhgrif 我相信这行不通。 NSArray 创建对 id-pointer 指向的对象的强引用,无论 id-pointer 是强指针还是弱指针。 @nhgrif,lancy 确实是正确的,即使变量是 __weak,数组仍然会保留传递的对象。【参考方案3】:
NSMutableArray *arrayStrong = [NSMutableArray arrayWithObjects:
                                      [[yourClass alloc] init],
                                      [[yourClass alloc] init], nil];

NSPointerArray *arrayWeak = [NSPointerArray weakObjectsPointerArray];

for(yourClass *obj in arrayStrong)
    [arrayWeak addPointer:(__bridge void*)(obj)];

【讨论】:

以上是关于如何将弱引用对象存储在数组中,字典中的objc?的主要内容,如果未能解决你的问题,请参考以下文章

Python入门-3序列:17字典-核心底层原理-内存分析-存储键值对过程

使用字典中的键对对象数组进行排序

引用存储在 Python 字典对象中的 pandas DataFrame 的特定列

如何更新 vuex 存储数组中的对象?

WatchKit:如何在 objC 中动态地对存储在 Nsmutablearray 中的图像进行动画处理

如何理解Python中的容器对象