NSString *str = nil;
NSDictionary *dic = @{@"key":str};
//zs20171220 會(huì)崩潰'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
字面量添加nil 會(huì)崩潰
NSString *str = nil;
NSDictionary *dicParam = [[NSDictionary alloc] initWithObjectsAndKeys:@"",@"key1",str,@"key2",nil];
NSLog(@"dicParam____%@",dicParam[@"key2"]);//zs20171220 value 值可以為nil,但是這個(gè)時(shí)候nil意味著結(jié)束添加了
NSLog(@"dicParam____%@",dicParam.allKeys); NSLog(@"dicParam____%@",dicParam[@"key1"]);//zs20171220 key 不能設(shè)置成nil 否則會(huì)崩潰
NSString *str = nil;
NSMutableDictionary *dicMutable = [NSMutableDictionary dictionaryWithCapacity:0];
[dicMutable setValue:str forKey:@"key1"];//zs20171220 插入nil 不會(huì)崩潰
[dicMutable setValue:@"ddd" forKey:@"key2"];
[dicMutable setValue:nil forKey:@"key3"];//zs20171220 插入nil 不會(huì)有這個(gè)key 和值
NSLog(@"___%@",dicMutable);
20180925+總結(jié):
? ?用字面量語(yǔ)法創(chuàng)建數(shù)組時(shí)要注意,若數(shù)組元素中有nil, 則會(huì)拋出異常,因?yàn)樽置媪空Z(yǔ)法實(shí)際上只是一種“語(yǔ)法糖”(syntactic sugar),其效果等于是先創(chuàng)建了一個(gè)數(shù)組,然后把方括號(hào)內(nèi)的所有對(duì)象都加到這個(gè)數(shù)組中。
eg: ? ??
NSArray *arrayA = [NSArray arrayWithObjects:obj1,obj2,obj3,nil]; ?
?NSArray *arrayB = @[obj1,obj2,obj3];
如果obj1與obj3都指向了有效的OC對(duì)象,而obj2是nil,按字面量語(yǔ)法創(chuàng)建數(shù)組arrayB時(shí)會(huì)拋出異常。
arrayA 雖然能創(chuàng)建出來,但是其中卻只含有obj1一個(gè)對(duì)象,原因在于arrayWithObjects:方法會(huì)依次處理各個(gè)參數(shù),直到發(fā)現(xiàn)nil為止,由于obj2是nil,所以該方法會(huì)提前結(jié)束。
重點(diǎn)(敲黑板):
? ? ? ?這個(gè)微妙的差別說明,使用字面量語(yǔ)法更為安全。拋出異常令應(yīng)用程序終止執(zhí)行,這比創(chuàng)建好數(shù)組之后發(fā)現(xiàn)元素個(gè)數(shù)少了要好。