2009-08-08 3 views
148

При взгляде на документацию я практически не вижу большой разницы. И «значение» и «объект» имеют тип id, поэтому может быть любой объект. Ключ - это строка, а в другом случае - идентификатор. Один из них, кажется, сохраняет объект, а другой - нет. Что еще? Какой из них для какого случая?Где разница между setObject: forKey: и setValue: forKey: в NSMutableDictionary?

+0

Возможный дубликат [Objective-C: В чем разница между objectForKey и valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey) – Mark

ответ

157

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

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

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

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

EDIT: и о, это выглядит, как это было предложено и ответил раньше: Difference between objectForKey and valueForKey?

+0

этот вопрос не совсем то же самое.речь идет о методах getter, тогда как этот вопрос касается методов setter – user102008

+1

Что вы подразумеваете под «В NSMutableDictionary, он меняет словарный запас, если вы не префикс ключа с символом« @ », и в этом случае он изменяет переменные-члены «. Какие переменные-члены? Также, может быть, вы можете прокомментировать http://stackoverflow.com/questions/5755917/? Благодарю. –

+0

только для полноты, setObject: forKey будет поднимать (исключение), если объект равен нулю. Будет ли setValue: forKey ведет себя одинаково или удалит существующий объект из словаря при установке nil для ключа? –

80

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

+10

Это очень полезно знать. Я иначе написал свою собственную категорию в NSMutableDictionary, чтобы выполнить именно это !. Спасибо – Arman

+2

Еще одно отличие заключается в подпикселе Object-C, вы можете написать 'dic [key] = value;' для поддержки удаления ключа, если значение равно 'nil'. Обычно подшивка - это лучший подход, чем 'setValue: forKey:' для выполнения этого. –

3

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

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

значение — Значение ключа.

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

+0

Спасибо за причину, по которой setObject: forKey: вызывает исключение. @breakfreehg –

5

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

Мертвые просто.

+0

Это именно то, как это работает. –

+0

О, ты прав, брат. Извини за это. Это описано здесь: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie

Смежные вопросы