OC 可变字典下标[]语法糖不是 setObject:forKey: 而等效于 KVC
2017-07-26 15:17
507 查看
转载地址:http://www.jianshu.com/p/2aebcff92a2e
场景是用户登录后需要在请求序列化器(
如果登录之前会传入nil,登录后传入服务端返回的token进行后续的请求
AFNetworking这一方法的内部实现如下
可以看到对mutableHTTPRequestHeaders为可变字典类型,保存value的方式是使用KVC的
而不是可变字典的setOjbect:forKey:方法
因为之前对字典的认识是内部不能有nil对象的,担心会传入nil而导致崩溃
分别使用setObject:forKey:,setValue:forKey:和使用字典[]语法糖传入nil值对之前保存的key进行覆盖测试
结果如下
代码如下
控制台输出的Log
控制台Log
使用KVC或者[]语法糖对可变字典进行key-value存值可以达到覆盖原有值的目的
因此,根据实际情况需要进行方法的选择
如果是有意识地想使用nil来覆盖原值时调用KVC或者[]点语法
如果不希望对应的key出现nil值,那么就使用setOjbect:forKey:方法,这样当出现异常时的崩溃可以定位错误
作者:席萍萍Brook_iOS深圳
链接:http://www.jianshu.com/p/2aebcff92a2e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
新情况
关于[]下标的用法有新的发现,在新的文章中进行了补充起因
在调试基于AFNetworking封装的HTTP请求时的发现更新了对字典的一些错误认识。场景是用户登录后需要在请求序列化器(
requestSerializer)的header中设置token对应field的值,
如果登录之前会传入nil,登录后传入服务端返回的token进行后续的请求
AFNetworking这一方法的内部实现如下
// 可变字典 @property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders; - (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { [self.mutableHTTPRequestHeaders setValue:value forKey:field]; }
可以看到对mutableHTTPRequestHeaders为可变字典类型,保存value的方式是使用KVC的
而不是可变字典的setOjbect:forKey:方法
因为之前对字典的认识是内部不能有nil对象的,担心会传入nil而导致崩溃
crash,所以对不可变字典的存值进行了测试
测试过程和结果
创建一个新的可变字典,保存一组正常的key-Value分别使用setObject:forKey:,setValue:forKey:和使用字典[]语法糖传入nil值对之前保存的key进行覆盖测试
结果如下
方法 | 结果 |
---|---|
setObject:forKey: | 崩溃 |
setValue:forKey: | 覆盖为nil |
[]语法糖 | 覆盖为nil |
NSMutableDictionary *dic = [NSMutableDictionary dictionary]; [dic setObject:@"object" forKey:@"key"]; NSLog(@"dic setValue %@", dic); [dic setValue:nil forKey:@"key"]; NSLog(@"dic after KVC %@ ", dic); [dic setObject:@"object" forKey:@"key"]; NSLog(@"dic setValue %@", dic); dic[@"key"] = nil; NSLog(@"dic after []语法糖 %@", dic); [dic setObject:@"object" forKey:@"key"]; NSLog(@"dic setValue %@", dic); [dic setObject:nil forKey:@"key"]; NSLog(@"dic after setObject %@ ", dic);
控制台输出的Log
控制台Log
小结
实际上setObject:forKey:显式地传入nil时Xcode会给出警告使用KVC或者[]语法糖对可变字典进行key-value存值可以达到覆盖原有值的目的
因此,根据实际情况需要进行方法的选择
如果是有意识地想使用nil来覆盖原值时调用KVC或者[]点语法
如果不希望对应的key出现nil值,那么就使用setOjbect:forKey:方法,这样当出现异常时的崩溃可以定位错误
作者:席萍萍Brook_iOS深圳
链接:http://www.jianshu.com/p/2aebcff92a2e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- kvc和字典在创建键值对时的相同与区别(setValue forKey )(setObject forKey)
- 字典方法setValue:ForKey setObject:ForKey的区别
- 字典setObject:forKey:与setObject:forKey:的区别
- reason: '*** setObjectForKey: object cannot be nil (key: 1)'-crash!
- CCDictionary(封装了哈希表.可以加入两种元素:键为整型或字符串值为ccobject.CCDICT_FOREACH objectForKey allKeysForObject setObj)
- setValue:forKey:与setObject:forKey:
- IOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- setObjectForKey: object cannot be nil (key: av)'
- setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- iOS KVC原理与setValue/valueForKey 崩溃解决
- IOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- iOS.KVC.setValue:forKey:
- NSUserDefaults setObject:forKey:方法崩溃问题
- IOS程序运行时崩溃日志setObjectForKey: object cannot be nil
- 从[id setValue: forKey:]了解KVC
- IOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- 错误:*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object
- 从[id setValue: forKey:]了解KVC
- setValue:forKey与setObject:forKey的差异
- iOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异