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: і о, схоже, на це було задано і відповіли раніше: Різниця між objectForKey та valueForKey?