Слабый объект в NSDictionary? - PullRequest
19 голосов
/ 05 января 2012

Я хотел бы сохранить нулевую слабую ссылку на объект в NSDictionary. Это для ссылки на родительский элемент NSDictionary, поэтому я могу сканировать большую структуру без поиска.

Я не могу использовать __weak здесь; даже если моя локальная ссылка слабая, NSDictionary будет хранить сильную ссылку на объект, на который слабо ссылались. И, конечно же, NSDictionary не может иметь nil объектов.

Я на iOS, а не на Mac, поэтому NSHashTable недоступен. И я хочу, чтобы только один объект был слабым; остальное все еще должно быть сильным.

(Я собираюсь опубликовать свой ответ, поэтому у меня есть кое-что, чтобы пометить как принятый, если нет лучшего ответа. Но я надеюсь, что у кого-то есть лучший ответ.)

Ответы [ 3 ]

37 голосов
/ 01 февраля 2013

В iOS 6+ можно использовать NSMapTable и выбирать, хотите ли вы, чтобы объекты и / или ключи были слабыми или сильными.

15 голосов
/ 05 января 2012

Я остановился на определении класса-контейнера с одним членом, например:

@interface Parent : NSObject
@property (nonatomic, weak) id parent;
@end

@implementation Parent

@synthesize parent = _parent;

- (id)initWithParent: (id)parent;
{
    if (( self = [super init] )) {
        _parent = parent;
    }
    return self;
}
@end

И используя его:

id parentRef = [[Parent alloc] initWithParent: parent];
[newElement setObject: parentRef forKey: ParentKey];

Я думаю, что это будет работать для меня, но кажется сумасшедшим , что нет лучшего способа встроить в Foundation.

6 голосов
/ 31 мая 2012

Есть встроенный способ;просто используйте:

[array addObject:[NSValue valueWithNonretainedObject:object]];

Затем, чтобы получить доступ к объекту позже, используйте:

id object = [[array objectAtIndex:i] nonretainedObjectValue];

Если значение было освобождено с момента его добавления, тогда «объект» будет недействительным указателем вiOS 4.x, и (я предполагаю) будет иметь значение nil ниже 5.x с включенной ARC.

РЕДАКТИРОВАТЬ: мое предположение было неверным - оно не слабое при ARC (см. обсуждение ниже).

...