在使用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:的可以是任何类型。
其他
[NSNull null]表示的是一个空对象,并不是nil。
当 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要稳健。