最近项目中常常出现下面的这个崩溃信息,经多方查找发现,是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,能够向字典中插入控制,并无引发崩溃.