Использует ли valueForKey: NSMutableDictionary copy для NSStrings? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть NSMutableDictionary с дюжиной ключей, каждая клавиша относится к значению NSString. Если я позвоню [myDictionary valueForKey:@"abc"], я получу объект NSString.

Это NSString скопировано?

Поскольку нет объявления @property, что происходит с этим извлечением строки? Я полагаю, я получил копию. Чем отличается NSMutableString?

Моя цель состоит в том, чтобы у меня был массив NSDictionaries. Я вызываю valueForKey в массиве, чтобы получить все ключи @ "abc" из коллекции словарей. Таким образом, теперь у меня есть массив NSStrings.

Мне нужно передать этот массив в NSOperation в фоновом потоке. Таким образом, NSStrings должны быть копиями, чтобы изменение словарей позже не приводило к изменению переданных в NSOperation словарей.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

NSDictionary ключи копируются при установке. В коде dictionary[key] = value объект key копируется, а словарь сохраняет копию. Объект value не копируется; вызывающая сторона и словарь имеют ссылку на один и тот же объект.

При извлечении ключей или объекта копирование не производится. dictionary.allKeys возвращает массив ключевых объектов в словаре, а не копии. Аналогично, dictionary[key] возвращает ссылку на значение для key в словаре.

И, как вы знаете, @property (copy) применяется только при установке значения. Получатели ObjC никогда не копируют объекты, если это специально не задокументировано или вы не пишете свои собственные.

Точно так же, чтобы ответить на ваш вопрос, метод ключ-значение использует те же правила, лежащие в основе этого свойства. Таким образом, -setValue:forKey:, -setValue:forKeyPath:, -valueForKey:, -valueForKeyPath: и т. Д. Получат или установят правильное значение, как если бы вы обращались к свойству напрямую. Другими словами, если значение копируется, когда свойство установлено, -setValue:forKeyPath: скопирует значение. Если средство доступа не копирует значение, то -valueForKey: не будет копировать значение.

0 голосов
/ 05 мая 2018

Из документации -[NSDictionary valueForKey:]:

Если ключ не начинается с «@», вызывает objectForKey :. Если ключ начинается с «@», обрезает «@» и вызывает [super valueForKey:] с остальной частью ключа.

Из документации -[NSMutableDictionary setObject:forKey:]:

Если aKey уже существует в словаре, его место занимает anObject.

valueForKey: делает objectForKey: и не копирует объект. setObject:forKey: заменяет объект, он не изменяет объект. Если вы делаете

[mutableDictionary setObject:@"klm" forKey:@"abc"];
a = [mutableDictionary valueForKey:@"abc"];
[mutableDictionary setObject:@"xyz" forKey:@"abc"];

сейчас a - старое значение @"klm".

...