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 )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要稳健。

你可能感兴趣的:(iOS Dictionary setObject:forKey 与 setValue:forKey:对比)