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,所以该方法会提前结束。
重点(敲黑板):
这个微妙的差别说明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后发现元素个数少了要好。