NSDictionary, который не копирует ключи для iPhone 3.0 SDK? - PullRequest
1 голос
/ 28 января 2010

Я использую NSDictionary в качестве связанного массива (т. Е. Ключи, которые я использую, могут быть любыми произвольными объектами). Одна из самых раздражающих вещей в NSDictionary заключается в том, что он всегда делает копию ключа и сохраняет его. В моем сценарии я позже получу ключи из NSDictionary и выполню некоторые операции с ними. Операция зависит от идентичности объекта ключей. Потому что ключи, которые я получил позже, являются копиями объектов, которые я изначально использовал в качестве ключей. Более поздняя проверка идентичности объекта не удалась.

У меня вопрос: есть ли какая-либо структура данных, подобная хеш-таблице, в iPhone 3.0 SDK, которая не копирует ключи? Спасибо.

Outdateboy

Ответы [ 3 ]

2 голосов
/ 28 января 2010

Если вы не хотите, чтобы ваш ключ был скопирован (или даже сохранен), вы можете использовать CFDictionary и предоставить kCFTypeDictionaryKeyCallbacks или NULL или настроенные обратные вызовы клавиш.

Чтобы проверить, равны ли объекты, вы должны использовать -isEqual: вместо ==.

1 голос
/ 12 декабря 2012

Недавно я сделал следующее, чтобы получить MutableDictionary, который не копирует свои ключи.

-(NSMutableDictionary*)mutableDictionaryWithRetainedKeys {
    CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    return CFBridgingRelease(dictionary);
}

Если ваши ключи не подчиняются NSCopying и вы хотите избежать предупреждений компилятора при установке ключа / значений, используйте:

CFDictionarySetValue(dictionary, (__bridge const void *)(key), (__bridge const void *)(value));
1 голос
/ 28 января 2010

NSDictionary - бесплатный, соединенный с CFDictionary. Так что просто сделайте:

CFDictionarySetValue((CFDictionaryRef)myMutableDict, key, object);

Ключ копируется только методом Какао.

...