NSMutableDictionary中的setObject:forKey:和setValue:forKey:有什么区别?


153

在查看文档时,我几乎看不出有什么大不同。“值”和“对象”都是id类型,因此可以是任何对象。键是一个字符串,在其他情况下是一个id。其中一个似乎保留了该对象,而另一个则没有。还有什么?哪一个适合什么情况?


Answers:


163

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时,请使用

编辑:哦,看来这已经被问过和回答了:objectForKey和valueForKey之间的区别?


这个问题并不完全相同。它是关于getter方法的,而这个问题是关于setter方法的
user102008

1
您的意思是“在NSMutableDictionary中,它会更改字典条目,除非您在键之前添加'@'字符-在这种情况下,它将修改成员变量。” 什么成员变量?另外也许您可以在stackoverflow.com/questions/5755917上发表评论?谢谢。
PeterŠtibraný2011年

仅出于完整性考虑,如果object为nil,则setObject:forKey将引发(异常)。setValue:forKey的行为是否相同,或者将key设置为nil时是否会从字典中删除现有对象?
Motti Shneor '16

好答案。真。为了完整起见,很高兴提及(至少在NSMutableDictionary上)setValue:forKey:允许nil值,并删除条目-而setObject:forKey:传递nil值时将引发异常并崩溃。
Motti Shneor

83

另一个区别是,如果给赋予nil值setValue:forKey:,则它将从字典中删除键(如果存在),否则不执行任何操作。但是,如果将的值设为nil setObject:forKey:,则会引发异常。


10
知道这很有用。否则,我已经在NSMutableDictionary上编写了自己的类别来完成此操作!谢谢
Arman 2012年

2
另一个区别是使用Objective-C下标,dic[key] = value;如果value为,则可以编写以支持删除键nil。通常,下标比setValue:forKey:完成此方法更好。
心教堂


4

anObject —键的值。对象在添加到之前会收到保留消息NSDictionary。该值不能为nil。

aKey —价值的关键。密钥已复制(使用copyWithZone:;密钥必须符合NSCopying协议)。密钥不能为nil。

value —键的值。

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


感谢您给出setObject:forKey:引发异常的原因。@breakfreehg
simbesi.com 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.