最近項目中常常出現下面的這個崩潰信息,經多方查找發現,是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
NSMutableDictionary的類別:
咱們來驗證一下,好比剛剛這個例子 例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,能夠向字典中插入控制,並無引發崩潰.