Где разница между 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). Ключ не должен быть нулем.

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

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