最近項(xiàng)目中經(jīng)常出現(xiàn)下面的這個(gè)崩潰信息,經(jīng)多方查找發(fā)現(xiàn),是nil指針對NSDictionary及NSArray初始化的影響,所以做了以下記錄,供以后自己查看.
-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
第一:正常使用字典的時(shí)候
NSString *value1 =@"value001";
NSString *value2 =@"value002222";
NSString *value3 =@"value003";
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key02",value3,@"key3", nil] ;
NSLog(@"%@",dic);
輸出結(jié)果:
demo[25109:378863] {
key02 = value002222;
key1 = value001;
key3 = value003;
}
第二:當(dāng)插入的數(shù)據(jù)有空值的時(shí)候,系統(tǒng)會(huì)阻止你向object[1]插入一個(gè)nil指針
NSString *value1 =@"value001";
NSString *value2 =nil;
NSString *value3 =@"value003";
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key02",value3,@"key3", nil] ;
NSLog(@"%@",dic);
輸出結(jié)果:
demo[25139:383616] {
key1 = value001;
}
第三:當(dāng)使用快速創(chuàng)建字典的時(shí)候
NSString *value1 =@"value001";
NSString *value2 =nil;
NSString *value3 =@"value003";
NSDictionary *dic =@{@"key1":value1,@"key2":value2,@"key3":value3};
NSLog(@"%@",dic);
運(yùn)行改程序,會(huì)出現(xiàn)下面的崩潰錯(cuò)誤信息
reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]'
第四:使用快速創(chuàng)建字典 解決崩潰方法 nil用[NSNull null]代替
NSString *value1 =@"value001";
NSString *value2 =[NSNull null];
NSString *value3 =@"value003";
NSDictionary *dic
=@{@"key1":value1,@"key2":value2,@"key3":value3};
NSLog(@"%@",dic);
輸出結(jié)果:{
key1 = value001;
key2 = "<null>";
key3 = value003;
}
同理四啰,使用NSArray時(shí)也應(yīng)該注意這類問題匙赞。這里不再演示.但是model類型的是否會(huì)出現(xiàn)以下問題呢?我們來看一個(gè)例子:
NSMutableArray *mutArr = [[NSMutableArray alloc]init];
People *p = [[People alloc]init];
p.name =@"Allison";
p.sex = nil;
p.address = @"美國";
p.love = @"蔬菜";
[mutArr addObject:p];
輸出結(jié)果:
demo[1777:90414] Allison-(null)-美國-蔬菜
可以看到,這里并不會(huì)引起崩潰,p.sex = nil并不會(huì)引起崩潰,因?yàn)檫@里添加到數(shù)組里面的是p對象,而不是p.sex這個(gè)屬性,如果我們是[mutArr addObject:p.sex];運(yùn)行發(fā)現(xiàn)出現(xiàn)了一樣的崩潰信息eason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
但是我總覺得這不是最好的解決方法,因?yàn)樘O果既然出了這個(gè)快速創(chuàng)建字典的方法,就說明程序員使用的幾率還是比較高的,因?yàn)槲覀冇袝r(shí)候add一個(gè)對象,并沒有判斷是否為nil ,所以如果因?yàn)榇中?造成這樣的崩潰,就不好了.所以對于這個(gè)問題,我覺得最好辦法還是應(yīng)該從根本上解決問題,所以寫了個(gè)類別來解決.
NSMutableArray的類別:
NSMutableDictionary的類別:
我們來驗(yàn)證一下,比如剛剛這個(gè)例子
例1:關(guān)于數(shù)組
NSMutableArray *mutArr = [[NSMutableArray alloc]init];
People *p = [[People alloc]init];
p.name =@"Allison";
p.sex = nil;
p.address = @"美國";
p.love = @"蔬菜";
[mutArr addSafeObject:p.sex];
輸出結(jié)果:
Printing description of mutArr:
<__NSArrayM 0x608000058f60>(
)
這里數(shù)組就是空,并沒有引起崩潰.
例2: 關(guān)于字典
NSString *value1 =@"value001";
NSString *value2 =nil;
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionaryWithCapacity:0];
[mutableDic setValue:value1 forKey:@"key1"];
[mutableDic setIfNilObject:value2 forKey:@"key2"];
NSLog(@"%@",mutableDic);
輸出結(jié)果:
{
key1 = value001;
key2 = "<null>";
}
這里使用了setIfNilObject,可以向字典中插入控制,并沒有引起崩潰.