转载地址: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
小结
实际上setObject:forKey:显式地传入nil时Xcode会给出警告
使用KVC或者[]语法糖对可变字典进行key-value存值可以达到覆盖原有值的目的
因此,根据实际情况需要进行方法的选择
- 如果是有意识地想使用nil来覆盖原值时调用KVC或者[]点语法
- 如果不希望对应的key出现nil值,那么就使用setOjbect:forKey:方法,这样当出现异常时的崩溃可以定位错误
作者:席萍萍Brook_iOS深圳
链接:http://www.jianshu.com/p/2aebcff92a2e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。