一,字典设置空值

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的时候就需要我们进行判断,否则容易出错

results matching ""

    No results matching ""