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

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,所以该方法会提前结束。

重点(敲黑板):

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

上一篇:向量的相关运算和几何意义(扫盲篇)


下一篇:iOS-《编写高质量代码》笔记-第七章 设计模式与Cocoa编程