При взгляде на документацию я практически не вижу большой разницы. И "значение", и "объект" имеют идентификатор типа, поэтому может быть любой объект. Ключ - это строка, а в другом случае - идентификатор. Один из них, кажется, сохраняет объект, а другой - нет. Что еще? Какой из них для какого случая?
Где разница между setObject: forKey: и setValue: forKey: в NSMutableDictionary?
Ответ 1
setValue:forKey:
является частью протокола NSKeyValueCoding, который, среди прочего, позволяет вам получить доступ к свойствам объекта от подобных интерфейсов Builder. setValue:forKey:
реализуется в классах, отличных от NSDictionary
.
setObject:forKey:
существует NSMutableDictionary's
причина существования. Его подпись, похоже, очень похожа на setValue: forKey:, но более общий (например, любой тип ключа). Это несколько совпадение, что подписи настолько похожи.
Что добавляет к путанице, так это то, что реализация NSMutableDictionary setValue:forKey:
в большинстве случаев эквивалентна setObject:forKey:
. В других классах setValue:forKey:
изменяет переменные-члены. В NSMutableDictionary
он изменяет словарные записи, если вы не префикс ключа с символом "@", и в этом случае он изменяет переменные-члены.
Итак, в двух словах, используйте setObject:forKey:
, когда вам нужно работать со словарными клавишами и значениями и setValue:forKey:
в более редких случаях, когда вам нужно решить KVP.
EDIT: и, похоже, об этом было задано и ответили раньше: Разница между objectForKey и valueForKey?
Ответ 2
Другое отличие состоит в том, что если вы даете значение nil для setValue:forKey:
, оно удаляет ключ из словаря, если он существует, в противном случае ничего не делает. Но если вы даете значение nil для setObject:forKey:
, оно вызывает исключение.
Ответ 3
-setValue:forKey:
просто отправьте -setObject:forKey:
в приемник, если значение не равно nil
, и в этом случае отправьте -removeObjectForKey
.
Мертвый просто.
Ответ 4
anObject — Значение для ключа. Объект получает сообщение сохранения перед добавлением в NSDictionary
. Это значение не должно быть nil.
aKey — Ключ к значению. Ключ скопирован (используя copyWithZone:
; ключи должны соответствовать протоколу NSCopying
). Ключ не должен быть нулем.
значение — Значение для ключа.
ключ — Ключ к значению. Обратите внимание, что при использовании кодирования с ключом ключ должен быть строкой (см. "Основы кодирования ключевых значений" ).