[__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,能够向字典中插入控制,并无引发崩溃.

相关文章
相关标签/搜索