Как хранить слабый ссылочный объект в массиве, словарь в objc?

Как мы знаем, когда вы добавляете объект в массив (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, который удерживает слабый указатель на значение.


На самом деле, идеи дизайна вышеуказанных методов одинаковы.

Ответ 2

Вы можете использовать NSValue valueWithNonretainedObject:, чтобы сильно сохранить значение, которое слабо ссылается на ваш целевой объект.

Ответ 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)];
}