При взгляде на документацию я практически не вижу большой разницы. И «значение» и «объект» имеют тип id, поэтому может быть любой объект. Ключ - это строка, а в другом случае - идентификатор. Один из них, кажется, сохраняет объект, а другой - нет. Что еще? Какой из них для какого случая?Где разница между setObject: forKey: и setValue: forKey: в NSMutableDictionary?
ответ
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?
этот вопрос не совсем то же самое.речь идет о методах getter, тогда как этот вопрос касается методов setter – user102008
Что вы подразумеваете под «В NSMutableDictionary, он меняет словарный запас, если вы не префикс ключа с символом« @ », и в этом случае он изменяет переменные-члены «. Какие переменные-члены? Также, может быть, вы можете прокомментировать http://stackoverflow.com/questions/5755917/? Благодарю. –
только для полноты, setObject: forKey будет поднимать (исключение), если объект равен нулю. Будет ли setValue: forKey ведет себя одинаково или удалит существующий объект из словаря при установке nil для ключа? –
Другим отличием является то, что если вы даете всухую значение setValue:forKey:
, он удаляет ключ из словаря, если она существует, в противном случае ничего не делает. Но если вы дадите нулевое значение setObject:forKey:
, оно вызывает исключение.
Это очень полезно знать. Я иначе написал свою собственную категорию в NSMutableDictionary, чтобы выполнить именно это !. Спасибо – Arman
Еще одно отличие заключается в подпикселе Object-C, вы можете написать 'dic [key] = value;' для поддержки удаления ключа, если значение равно 'nil'. Обычно подшивка - это лучший подход, чем 'setValue: forKey:' для выполнения этого. –
anObject — Значение для ключа. Объект получает сообщение сохранения перед добавлением в NSDictionary
. Это значение не должно быть nil.
aKey — Ключ к значению. Ключ скопирован (с использованием copyWithZone:
; ключи должны соответствовать протоколу NSCopying
). Ключ не должен быть нулем.
значение — Значение ключа.
ключ — Ключ к значению. Обратите внимание, что при использовании ключевого значения ключ должен быть строкой (см. «Основы кодирования ключевых значений»).
Спасибо за причину, по которой setObject: forKey: вызывает исключение. @breakfreehg –
-setValue:forKey:
просто отправить -setObject:forKey:
к приемнику, если значение не nil
, в этом случае отправить -removeObjectForKey
.
Мертвые просто.
Это именно то, как это работает. –
О, ты прав, брат. Извини за это. Это описано здесь: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie
- 1. NSMutableDictionary setObject forKey forKey ... и т. Д.
- 2. setObject: forKey: метод NSMutableDictionary
- 3. CKRecord setValue: forKey или setObject: forKey
- 4. NSMutableDictionary setValue:/forKey :?
- 5. Невозможно setObject: forKey: in NSMutableDictionary
- 6. селектор NSMutableDictionary SetObject forkey ошибку
- 7. setValue forKey в сообщениях NSMutableDictionary
- 8. __NSDictionaryI setObject: forKey: Crash
- 9. Singleton Свойство NSMutableDictionary не позволит setObject: forKey
- 10. setValue: forKey: с NSString
- 11. Как использовать setObject: forKey, где Key также является NSMutableDictionary?
- 12. NSUserDefaults setObject: forKey deadlocks?
- 13. setValue: forKey со структурой
- 14. IOS NSMutableDictionary является нулевым, когда я SetValue и forKey
- 15. setObject: forKey: of NSMutableDictionary перезаписывает все данные в словаре
- 16. Пользовательские базовые поставщики данных - setValue: forKey: против setPrimitiveValue: forKey:
- 17. NSMutableDictionary SetObject: forkey: сбой с сообщением непризнанного селектора
- 18. iPhone - SetValue: forkey: не документированы
- 19. SetValue: forKey аварии с _sigtramp
- 20. Есть ли [NSMutableDictionary setValue: значение forKey: key] сохранить ключ NSString?
- 21. App аварии с помощью SetValue: forKey
- 22. - [__ NSDictionaryI SetObject: forKey]: непризнанный селектор направлен например 0x91da0f0
- 23. setValue: ForKey: вместо набора (что угодно)?
- 24. SetObject forKey Обновление Все Предыдущий товар
- 25. CloudKit - исключение из CKRecord setObject: forKey:
- 26. NSUserDefaults setObject: forKey: очень дорогое время
- 27. приложение падает на [__NSCFDictionary SetObject: forKey:] в прошивкой только
- 28. NSUserDefaults setObject: forKey: попытка вставить объект списка объектов без свойства
- 29. Зачем использовать registerDefaults: вместо setValue: forKey :?
- 30. Как переопределить setObject: forKey: метод (в Foundation Framework)
Возможный дубликат [Objective-C: В чем разница между objectForKey и valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey) – Mark