iOS -- could not set nil as the value for the key问题解决

在数据请求中我们经常会用到模型去解析数据,就难免会用到这个方法

 - (void)setValue:(id)value forKey:(NSString *)key

这个方法是使用一个字符串标示符给一个对象的属性赋值。

这个方法实现时是首先去接收者(调用方法的那个对象)的类中查找与key相匹配的访问器方法(-set),如果找到了一个方法,就检查它参数的类型,如果它的参数类型不是一个对象指针类型,但是只为nil,就会执行setNilValueForKey:方法,setNilValueForKey:方法的默认实现,是产生一个NSInvalidArgumentException的异常(参考https://www.jianshu.com/p/d54af904967b)

报上述异常时,程序会崩溃,控制台打印错误log

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
 reason: '[ setNilValueForKey]: could not set nil 
as the value for the key createUser.'

也就是我们题目中显示的log。

解决方法如下:

1.在model的基类中重写这个方法
- (void)setNilValueForKey:(NSString *)key{};

如果方法参数的类是一个对象指针类型,就会简单的执行这个方法,传入对应的参数.如果方法的参数类型是NSNumber或NSValue的对应的基本类型,先把它转换为基本数据类,再执行方法,传入转换后的数据.

2.你如果使用网络请求类是AFN那么可以通过设置AFN中responseSerializer的removesKeysWithNullValues属性来规避空值
/**
 Whether to remove keys with `NSNull` values from response JSON. Defaults to `NO`.
 */
@property (nonatomic, assign) BOOL removesKeysWithNullValues;

实现如下:

 ((AFJSONResponseSerializer *)session.responseSerializer).removesKeysWithNullValues

第二个方法网上看到的,楼主没有试过 不知道有没有效果 -.-

你可能感兴趣的:(iOS -- could not set nil as the value for the key问题解决)