В чем разница между setObject: forKey: и setValue: forKey: в NSMutableDictionary? - PullRequest
152 голосов
/ 08 августа 2009

При просмотре документации я почти не вижу большой разницы. И "value", и "object" имеют тип id , поэтому может быть любым объектом. Ключ один раз является строкой, а в другом случае - идентификатором. Один из них, кажется, сохраняет объект, а другой нет. Что-то еще? Какой для какого случая?

Ответы [ 4 ]

163 голосов
/ 08 августа 2009

setValue:forKey: является частью протокола NSKeyValueCoding , который, помимо прочего, позволяет получить доступ к свойствам объекта из подобных Интерфейсному Разработчику. setValue:forKey: реализован в классах, отличных от NSDictionary.

setObject:forKey: является NSMutableDictionary's причиной существования. Его сигнатура очень похожа на setValue: forKey :, но является более общей (например, любой тип ключа). Несколько совпадение, что подписи так похожи.

Что добавляет путаницу, так это то, что реализация setValue:forKey: в NSMutableDictionary эквивалентна setObject:forKey: в большинстве случаев. В других классах setValue:forKey: изменяет переменные-члены. В NSMutableDictionary он изменяет записи словаря, если только вы не префиксируете ключ символом «@» - в этом случае он изменяет переменные-члены.

Итак, в двух словах, используйте setObject:forKey:, когда вам нужно работать с ключами и значениями словаря, и setValue:forKey: в более редких случаях, когда вам нужно заняться KVP .

РЕДАКТИРОВАТЬ: и о, похоже, это уже задавали и отвечали раньше: Разница между objectForKey и valueForKey?

82 голосов
/ 16 февраля 2011

Другое отличие состоит в том, что если вы присвоите nil значение setValue:forKey:, он удалит ключ из словаря, если он существует, в противном случае ничего не сделает. Но если вы зададите nil для setObject:forKey:, это вызовет исключение.

9 голосов
/ 02 сентября 2016

-setValue:forKey: просто отправьте -setObject:forKey: получателю, если значение не равно nil, в этом случае отправьте -removeObjectForKey.

Очень просто.

3 голосов
/ 17 февраля 2011

anObject & mdash; Значение для ключа. Объект получает сообщение сохранения перед добавлением в NSDictionary. Это значение не должно быть ноль.

aKey & mdash; Ключ к значению. Ключ копируется (используется copyWithZone:; ключи должны соответствовать протоколу NSCopying). Ключ не должен быть равен нулю.

значение & mdash; Значение для ключа.

ключ & mdash; Ключ к значению. Обратите внимание, что при использовании кодирования значения ключа ключ должен быть строкой (см. «Основы кодирования значения ключа»).

...