setObject:forKey:和setValue:forKey:在NSMutableDictionary中的区别在哪里?

时间:2009-08-08 18:57:54

标签: ios iphone nsmutabledictionary

在查看文档时,我几乎看不到任何重大差异。 “value”和“object”都是id 类型,因此可以是任何对象。 Key一次是字符串,另一种情况是id。其中一个似乎保留了对象,而另一个则没有。还有什么?哪一个适用于哪种情况?

4 个答案:

答案 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协议。关键不能是零。

- 键的值。

- 价值的关键。请注意,使用键值编码时,键必须是字符串(请参阅“键值编码基础”)。