Ответ 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, который удерживает слабый указатель на значение.
На самом деле, идеи дизайна вышеуказанных методов одинаковы.