您的位置:首页 > 移动开发 > Objective-C

OC 可变字典下标[]语法糖不是 setObject:forKey: 而等效于 KVC

2017-07-26 15:17 507 查看
转载地址: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

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: