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

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

 - (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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,835评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,801评论 1 32
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,828评论 0 9
  • 昨天,起笔说教育,大放厥词。今天工作间隙想着第二篇独立书写内容时,感觉自己好无知,我尽然可以来谈教育?!古今中外各...
    大东合肥阅读 4,429评论 5 3
  • 雍人~2016-11-20- 0:10 美国54岁死囚乔·哈里斯,应在2012年11月27日14点执行死刑,在死前...
    532595b5d06e阅读 3,471评论 0 1