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

在看文档时,我几乎看不出有什么大的差别。 “value”和“object”都是idtypes ,所以可以是任何对象。 密钥曾经是一个string,在另一种情况下是一个ID。 其中一个似乎保留了这个对象,另一个则没有。 还有什么? 哪一个是为了什么情况?

setValue:forKey:是NSKeyValueCoding协议的一部分,除此之外,它允许您从Interface Builder之类的对象中访问对象属性。 setValue:forKey:NSDictionary以外的类中实现。

setObject:forKey:NSMutableDictionary's存在NSMutableDictionary's原因。 它的签名恰好与setValue:forKey:非常相似,但更通用(例如任何键types)。 签名是如此相似是有点巧合。

更令人困惑的是,在大多数情况下,NSMutableDictionary的setValue:forKey:的实现等同于setObject:forKey: 在其他类中, setValue:forKey:更改成员variables。 在NSMutableDictionary ,它会改变字典条目,除非你用“@”字符作为前缀 – 在这种情况下,它会修改成员variables。

所以, 简而言之,当需要使用字典键和值时,使用setObject:forKey:以及在需要处理KVP的极less情况下使用setValue:forKey:

编辑:哦,它看起来像这样的问题和答案: objectForKey和valueForKey之间的区别?

另一个区别是,如果给setValue:forKey:赋予一个nil值,如果它存在,它将从字典中删除键,否则什么也不做。 但是,如果给setObject:forKey:赋予一个nil值,则会引发exception。

-setValue:forKey:只发送-setObject:forKey:给接收者,除非值为nil ,在这种情况下发送-removeObjectForKey

死简单。

anObject – 键的值。 对象在被添加到NSDictionary之前收到一个保留消息。 这个值不能为零。

aKey – 价值的关键。 密钥被复制(使用copyWithZone:密钥必须符合NSCopying协议)。 关键不能是零。

价值 – 钥匙的价值。

关键 – 价值的关键。 请注意,使用键值编码时,键必须是string(请参阅“键值编码基础知识”)。