一,字典设置空值
key为空,或value为空或两者都为空时,debug报错:
2017-12-04 09:16:47.903336+0800 test[1028:16639] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
1,设置字典
编码过程中,使用字典时,习惯性写法:
NSDictionary *dic = @{key1: value1, key2: value2};
一般没有逐步的进行键值是否为空的判断,直接使用;而且项目中会大量存在这样的代码
逐步判断处理
一个字典中,一般会传入多个值,如果需要逐步判断,则有多少个键值对就需要进行几次if判断,比较麻烦且代码很难看,但是能够保证字典中对应的键值是有值的
全局处理思路:
使用hook的方式,替换 - (void)setObject:(id)value forKey:(NSString* )key
方法,
- (void)safe_setObject:(id)value forKey:(NSString* )key {
if (value && key) {
[self safe_setObject:value forKey:key];
} else {
NSLog(@"[NSMutableDictionary setObject: forKey:%@]值不能为空;",key);
}
}
value为空使用 [NSNull null]
对象的分析
参考: iOS Crash 杀手排名 在每个key都需要传入到字典中的时候,如果value为空,可以使用
NSNull
对象填充。 优点:能够保证字典中存在所有的key中 缺点:传入NSNull
对象替代,获取到的就是一个NSNull
对象,而不是一个空值
2,取值
自己编写代码的时候,一般我们认为自己设置的字典的key-value都是完整的,会直接取值进行使用。而上述的操作说明我们获取value时可能是一个nil(或者使用 NSNull
对象替代),使用这个value的时候就需要我们进行判断,否则容易出错