在数据请求中我们经常会用到模型去解析数据,就难免会用到这个方法
- (void)setValue:(id)value forKey:(NSString *)key
这个方法是使用一个字符串标示符给一个对象的属性赋值。
这个方法实现时是首先去接收者(调用方法的那个对象)的类中查找与key相匹配的访问器方法(-set<Key>),如果找到了一个方法,就检查它参数的类型,如果它的参数类型不是一个对象指针类型,但是只为nil,就会执行setNilValueForKey:方法,setNilValueForKey:方法的默认实现,是产生一个NSInvalidArgumentException的异常(参考https://www.jianshu.com/p/d54af904967b)
报上述异常时,程序会崩溃,控制台打印错误log
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '[<ModelContrastModel 0x60c0002c94c0> 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
第二个方法网上看到的,楼主没有试过 不知道有没有效果 -.-