[__NSPlaceholderDictionary initWithObjects forKeys count ] attempt to

最近項目中常常出現下面的這個崩潰信息,經多方查找發現,是nil指針對NSDictionary及NSArray初始化的影響,因此作了如下記錄,供之後本身查看. -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]程序員

第一:正常使用字典的時候數組

NSString *value1 =@"value001";
NSString *value2 =@"value002222";
NSString *value3 =@"value003";

NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key02",value3,@"key3", nil] ;
NSLog(@"%@",dic);

輸出結果:
demo[25109:378863] {
key02 = value002222;
key1 = value001;
key3 = value003;
}
複製代碼

第二:當插入的數據有空值的時候,系統會阻止你向object[1]插入一個nil指針spa

NSString *value1 =@"value001";
NSString *value2 =nil;
NSString *value3 =@"value003";

NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key02",value3,@"key3", nil] ;
NSLog(@"%@",dic);

輸出結果:
demo[25139:383616] {
key1 = value001;
}
複製代碼

第三:當使用快速建立字典的時候3d

NSString *value1 =@"value001";
NSString *value2 =nil;
NSString *value3 =@"value003";

NSDictionary *dic =@{@"key1":value1,@"key2":value2,@"key3":value3};


NSLog(@"%@",dic);
複製代碼

運行改程序,會出現下面的崩潰錯誤信息 reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]'指針

第四:使用快速建立字典 解決崩潰方法 nil用[NSNull null]代替code

NSString *value1 =@"value001";
NSString *value2 =[NSNull null];
NSString *value3 =@"value003";
NSDictionary *dic 
    =@{@"key1":value1,@"key2":value2,@"key3":value3};
NSLog(@"%@",dic);

輸出結果:{
key1 = value001;
key2 = "<null>";
key3 = value003;
}
複製代碼

同理,使用NSArray時也應該注意這類問題。這裏再也不演示.可是model類型的是否會出現如下問題呢?咱們來看一個例子:cdn

NSMutableArray *mutArr = [[NSMutableArray alloc]init];
People *p = [[People alloc]init];
p.name =@"Allison";
p.sex = nil;
p.address = @"美國";
p.love = @"蔬菜";
[mutArr addObject:p];
輸出結果:
demo[1777:90414] Allison-(null)-美國-蔬菜
複製代碼

能夠看到,這裏並不會引發崩潰,p.sex = nil並不會引發崩潰,由於這裏添加到數組裏面的是p對象,而不是p.sex這個屬性,若是咱們是[mutArr addObject:p.sex];運行發現出現了同樣的崩潰信息eason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'對象

可是我總以爲這不是最好的解決方法,由於蘋果既然出了這個快速建立字典的方法,就說明程序員使用的概率仍是比較高的,由於咱們有時候add一個對象,並無判斷是否爲nil ,因此若是由於粗心,形成這樣的崩潰,就很差了.因此對於這個問題,我以爲最好辦法仍是應該從根本上解決問題,因此寫了個類別來解決.blog

NSMutableArray的類別: ip

屏幕快照 2017-02-22 下午10.25.42.png

屏幕快照 2017-02-22 下午10.26.03.png

NSMutableDictionary的類別:

![屏幕快照 2017-02-22 下午10.26.24.png](http://upload-images.jianshu.io/upload_images/1672235-a34832346ff02d83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

咱們來驗證一下,好比剛剛這個例子 例1:關於數組

NSMutableArray *mutArr = [[NSMutableArray alloc]init];
People *p = [[People alloc]init];
p.name =@"Allison";
p.sex = nil;
p.address = @"美國";
p.love = @"蔬菜";
[mutArr addSafeObject:p.sex];
輸出結果: 
Printing description of mutArr:
<__NSArrayM 0x608000058f60>(

)
複製代碼

這裏數組就是空,並無引發崩潰. 例2: 關於字典

NSString *value1 =@"value001";
NSString *value2 =nil;
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionaryWithCapacity:0];
[mutableDic setValue:value1 forKey:@"key1"];
[mutableDic setIfNilObject:value2 forKey:@"key2"];
NSLog(@"%@",mutableDic);
輸出結果:
 {
key1 = value001;
key2 = "<null>";
}
複製代碼

這裏使用了setIfNilObject,能夠向字典中插入控制,並無引發崩潰.

相關文章
相關標籤/搜索