nil / Nil / NULL / NSNull

NSNull 风波

最近我开发的 iOS APP 通过友盟发现了一个新的崩溃,日志如下:

nil / Nil / NULL / NSNull_第1张图片

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 中有四种不同的空值,以下是这四种空值表达式的值和含义:

nil / Nil / NULL / NSNull_第2张图片

*PS: 我没有找到的表格功能,所以我用 MacDown 生成了这个表格并以截图的形式放在这里,然而它并不清楚。如果你知道如何在的文章中添加表格,麻烦留言告诉我,谢谢:)

共勉。:)

你可能感兴趣的:(nil / Nil / NULL / NSNull)