iOS 给字典中插入nil的几种情景-阿里云开发者社区

开发者社区> 安全> 正文

iOS 给字典中插入nil的几种情景

简介: NSString *str = nil; NSDictionary *dic = @{@"key":str}; //zs20171220 会崩溃'*** -[__NSPlaceholderDictionary initWithObjec...

NSString *str = nil;

NSDictionary *dic = @{@"key":str};

//zs20171220 会崩溃'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]

字面量添加nil 会崩溃


NSString *str = nil;

NSDictionary *dicParam = [[NSDictionary alloc] initWithObjectsAndKeys:@"",@"key1",str,@"key2",nil];

NSLog(@"dicParam____%@",dicParam[@"key2"]);//zs20171220 value 值可以为nil,但是这个时候nil意味着结束添加了

NSLog(@"dicParam____%@",dicParam.allKeys); NSLog(@"dicParam____%@",dicParam[@"key1"]);//zs20171220 key 不能设置成nil 否则会崩溃

NSString *str = nil;

NSMutableDictionary *dicMutable = [NSMutableDictionary dictionaryWithCapacity:0];

[dicMutable setValue:str forKey:@"key1"];//zs20171220 插入nil 不会崩溃

[dicMutable setValue:@"ddd" forKey:@"key2"];

[dicMutable setValue:nil forKey:@"key3"];//zs20171220 插入nil 不会有这个key 和值

NSLog(@"___%@",dicMutable);


20180925+总结:

   用字面量语法创建数组时要注意,若数组元素中有nil, 则会抛出异常,因为字面量语法实际上只是一种“语法糖”(syntactic sugar),其效果等于是先创建了一个数组,然后把方括号内的所有对象都加到这个数组中。

eg:     

NSArray *arrayA = [NSArray arrayWithObjects:obj1,obj2,obj3,nil];  

 NSArray *arrayB = @[obj1,obj2,obj3];

如果obj1与obj3都指向了有效的OC对象,而obj2是nil,按字面量语法创建数组arrayB时会抛出异常。

arrayA 虽然能创建出来,但是其中却只含有obj1一个对象,原因在于arrayWithObjects:方法会依次处理各个参数,直到发现nil为止,由于obj2是nil,所以该方法会提前结束。

重点(敲黑板):

       这个微妙的差别说明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后发现元素个数少了要好。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章