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


转载地址: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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值