NSNull 风波
最近我开发的 iOS APP 通过友盟发现了一个新的崩溃,日志如下:
NSNull 到底是个什么东西?我从来没有调用过这个类,那么它又是哪产生的?
通过 search 和排查,我最终定位了这个问题,这个 NSNull 是由 AFNetworking 的一个函数回调产生的:
我在取 responseObject 的某个 value 时,得到了一个 NSNull 对象,而这个对象本应该是一个 NSString 的。
通过与 PHP 服务器同学联调,我们最终发现了这个问题产生的原因。
原来,服务器同学在获取某个字段的时候,不小心填错了参数,导致获取到的字段为空。他将这个空作为这个 Key 的 Value 填入了 JSON。
iOS APP 这边,AFNetworking 发现了这个空,它跟 Objective-C 中的 nil 有着显著的区别,因为 Objective-C 中的 NSDictionary 是不允许某一个 Key 对应的 Value 为 nil的。 这个空,最终被转化成了一个 NSNull 对象。
那么 NSNull 究竟是什么?
NSNull: 有作没有
NSNull 在 Foundation 框架中被广泛使用,以解决 NSArray 和 NSDictionay 之类的集合不能有 nil 值的缺陷。我们可以将 NSNull 理解为 nil 在集合中的封装,以达到在集合中表示“空”的目的:
NSMutableDictionary* mutableDictionary = [NSMutableDictionarydictionary];
mutableDictionary[@"someKey"] = [NSNullnull];
NSLog(@"Keys: %@",[mutableDictionaryallKeys]);// @[@"someKey"]
nil / Nil / NULL / NSNull
Objective-C 中有四种不同的空值,以下是这四种空值表达式的值和含义:
*PS: 我没有找到简书的表格功能,所以我用 MacDown 生成了这个表格并以截图的形式放在这里,然而它并不清楚。如果你知道如何在简书的文章中添加表格,麻烦留言告诉我,谢谢:)
共勉。:)
网友评论
|标识|值|含义|
|-|-|-|
|Null|(void*)0|C指针的字面零值|
|nil|(id)0|ObjC对象的字面零值|
|Nil|(Class)0|ObjC类的字面零值|
|NSNull|[NSNull null]|用来表示零值的单独对象|