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

时间:2014-02-15 12:36:16

标签: ios objective-c nsarray weak-references

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

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

3 个答案:

答案 0 :(得分: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类,该类保存指向该值的弱指针。


实际上,上述方法的设计思路是一样的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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