在查看文档时,我几乎看不到任何重大差异。 “value”和“object”都是id 类型,因此可以是任何对象。 Key一次是字符串,另一种情况是id。其中一个似乎保留了对象,而另一个则没有。还有什么?哪一个适用于哪种情况?
答案 0 :(得分:161)
setValue:forKey:
是NSKeyValueCoding协议的一部分,除其他外,它允许您从Interface Builder等访问对象属性。 setValue:forKey:
是在NSDictionary
以外的其他类中实现的。
setObject:forKey:
有NSMutableDictionary's
理由存在。它的签名恰好与setValue:forKey:非常相似,但更通用(例如任何键类型)。签名非常相似,这有点巧合。
令人困惑的是,在大多数情况下,NSMutableDictionary的setValue:forKey:
实现等同于setObject:forKey:
。在其他类中,setValue:forKey:
更改成员变量。在NSMutableDictionary
中,它会更改字典条目,除非您在密钥前加上“@”字符 - 在这种情况下它会修改成员变量。
因此,简而言之,当您需要使用字典键和值时使用setObject:forKey:
,而在需要解决KVP的极少数情况下使用setValue:forKey:
。 强>
编辑:哦,看起来之前已经有人问过并回答过:Difference between objectForKey and valueForKey?
答案 1 :(得分:82)
另一个区别是,如果你给setValue:forKey:
一个nil值,它会从字典中删除密钥(如果它存在),否则什么也不做。但是如果你给setObject:forKey:
一个零值,它会引发异常。
答案 2 :(得分:9)
-setObject:forKey:
只需向接收方发送nil
,除非值为-removeObjectForKey
,在这种情况下发送{{1}}。
死了简单。
答案 3 :(得分:3)
anObject - 键的值。在添加到NSDictionary
之前,对象会收到保留消息。该值不得为零。
aKey - 价值的关键。密钥被复制(使用copyWithZone:
;密钥必须符合NSCopying
协议。关键不能是零。
值 - 键的值。
键 - 价值的关键。请注意,使用键值编码时,键必须是字符串(请参阅“键值编码基础”)。