iOS Dictionary setObject:forKey 与 setValue:forKey:对比

在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject forKey,他们经常是可以交互使用的,代码中经常每一种的使用都有。

setValue:forKey:

/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:*/
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

由注释可知:setValue:forKey: value不为nil的时候调用setObject:forKey: ,value为nil的时候调用 -removeObjectForKey。

setObject:forKey:

@interface NSMutableDictionary :NSDictionary
- (void)removeObjectForKey:(id)aKey;
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
@end

setObject:forKey:中Key的对象是一个id类型

区别

1, setObject:forkey:中value是不能够为nil的,不然会报错。Xcode中如果value为nil会提示警告,运行会报错。
所以,代码中能用setValue:forKey:的尽量用setValue:forKey:

警告

2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型。

其他

  1. [NSNull null]表示的是一个空对象,并不是nil。

  2. 当 setValue:forKey:方法调用者是对象的时候:
    setValue:forKey:方法是在NSObject对象中创建的,也就是说所有的oc对象都有这个方法,所以可以用于任何类。
    比如使用:
    SomeClass *someObj = [[SomeClass alloc] init];
    [someObj setValue:self forKey:@"delegate"];
    表示的意思是:对象someObj设置他的属性的值为当前类,当然调用此方法的对象必须要有delegate属性才能设置,不然调用了也没效果。

总结

[obj setValue:@"xxx" forKey:@"xxx"]的用法实际上就是KVC,ios很多时候的名字叫起来很高大上,实际上这都是其它语言里一些很平常的东西。
在正常网络请求传参的时候,一般情况下,建议用setValue, 比setObject要稳健。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,268评论 30 472
  • 在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject f...
    myk阅读 201评论 0 0
  • 今天测试项目,无网络状态下进入,会出现崩溃,看了下崩溃原因: *** setObjectForKey: objec...
    Chau_Yue阅读 471评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,856评论 0 9
  • 2017年6月14日 星期三 晴 五年级二班 崔津恺妈妈 今晚给儿子检查作业,发现有一道数学题...
    豆瓣儿_b63d阅读 239评论 0 0