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(请参阅“键值编码基础知识”)。