iOS給字典中插入nil的幾種情景

道明白發表於2017-12-20

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,所以該方法會提前結束。

重點(敲黑板):

       這個微妙的差別說明,使用字面量語法更為安全。丟擲異常令應用程式終止執行,這比建立好陣列之後發現元素個數少了要好。


相關文章