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

153 iphone nsmutabledictionary ios

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

Ore*_*ner 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之间的区别?


use*_*008 83

另一个区别是,如果你给出一个nil值setValue:forKey:,它会从字典中删除密钥(如果它存在),否则什么都不做.但是,如果你给出一个零值setObject:forKey:,它会引发异常.

  • 这非常有用.我还在NSMutableDictionary上编写了我自己的类别来完成这个!谢谢 (10认同)
  • 另一个区别在于objective-c下标,你可以写`dic [key] = value;`来支持删除键,如果值是'nil`.订阅通常比`setValue:forKey:`更好地实现此目的. (2认同)

Jak*_*lář 9

-setValue:forKey:只是发送-setObject:forKey:到接收器,除非值是nil,在这种情况下发送-removeObjectForKey.

死简单.