如何在Objective-C中将弱引用对象存储在数组和字典中?

12

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

是否可能以弱引用的方式将对象添加到数组中?

3个回答

9

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 类来保存对值的弱引用。


实际上,上述方法的设计思想是相同的。


3
更好的选择:NSPointerArray。 - CodeSmile
如果您使用valueWithNonretainedObject,则NSValue将不包含弱引用,而是包含非保留对象。如果对象被释放并且您访问该引用,则可能会导致崩溃。 - Borzh
提示:使用 [NSPointerArray weakObjectsPointerArray] - Borzh

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

1
你可以使用NSValue valueWithNonretainedObject:来强制存储一个值,该值弱引用您的目标对象。

其他方法,例如 __weak typeof(object) weakObject = object; [NSMutableArray addObject:weakObject]; 是否可行?或者是 [NSMutableArray addObject:(id)object]; - nhgrif
3
我认为这行代码不会起作用。无论id指针是强指针还是弱指针,NSArray都会创建一个指向该对象的强引用。我会保持原意,尽量让翻译易懂。 - lancy
@nhgrif,确实Lancy是正确的,即使变量是__weak,数组仍将保留传递的对象。 - Wain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接