iOS--setValue和setObject中踩到的坑

在开发的过程中,对一个NSMutableDictionary(可变字典)设置键值对的时候,一般会采用setObject这个方法,但是在项目中,去云捕上看到的用户出错,好多都是报这样的错误。


iOS--setValue和setObject中踩到的坑_第1张图片

很明显就是在setObject方法中插入了空值而导致的报错。解决的办法是将setObject替换成setValue就可以了。虽然解决了,但是他们之间的区别以及为什么setValue就可以呢?

因为setObject方法中,值必须是不为空的任意类型(nonnull),而setValue方法中,值可以为空值(nullable),并且在setValue方法中,假如你传的值为空的话,那么他会调用- (void)removeObjectForKey:(id)aKey;这个方法。所以用setValue方法可以有效的防止值为空所出现的炸裂现象。

注意:在系统给出的方法中,我们可以明显的看到,setValue方法中,key必须是不为空的字符串(nonnull NSString),而setObject方法中,可以传入不为空的id类型。

setValue和setObject的一些拓展�:

1.setObject方法是NSDictionary这个类中特有的,而setValue是KVC(key-value-coding  键值编码)中的主要方法。

2.setObject方法中,虽然值不能为nil,但是可以为[NSNull null],并且key可以为NSString, NSNumber等类型。

3.当 setValue:forKey:方法调用者是对象的时候:

setValue:forKey:方法是在NSObject对象中创建的,也就是说所有的oc对象都有这个方法,所以可以用于任何类。

比如使用一个person类:

Person *person = [[Person alloc] init];

[person setValue:self forKey:@"delegate"];

表示的意思是:对象person设置他的delegate属性的值为当前类,当然调用此方法的对象必须要有delegate属性才能设置,不然调用了也没效果。(这条目前还不太理解,希望有看到的大神指教)

setValue和setObject参考链接:http://blog.csdn.net/itianyi/article/details/8661997

你可能感兴趣的:(iOS--setValue和setObject中踩到的坑)