众所周知,当您将对象添加到数组(NSMutableArray)或字典(NSMutableDictionary)时,它会创建对该对象的强引用。
是否可以将对象添加到具有弱引用的数组?
答案 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)];
}