NSNull 風(fēng)波
最近我開發(fā)的 iOS APP 通過友盟發(fā)現(xiàn)了一個(gè)新的崩潰,日志如下:

NSNull 到底是個(gè)什么東西?我從來沒有調(diào)用過這個(gè)類,那么它又是哪產(chǎn)生的?
通過 search 和排查,我最終定位了這個(gè)問題,這個(gè) NSNull 是由 AFNetworking 的一個(gè)函數(shù)回調(diào)產(chǎn)生的:?

我在取 responseObject 的某個(gè) value 時(shí),得到了一個(gè) NSNull 對象,而這個(gè)對象本應(yīng)該是一個(gè) NSString 的。
通過與 PHP 服務(wù)器同學(xué)聯(lián)調(diào),我們最終發(fā)現(xiàn)了這個(gè)問題產(chǎn)生的原因。
原來,服務(wù)器同學(xué)在獲取某個(gè)字段的時(shí)候,不小心填錯(cuò)了參數(shù),導(dǎo)致獲取到的字段為空。他將這個(gè)空作為這個(gè) Key 的 Value 填入了 JSON。
iOS APP 這邊,AFNetworking 發(fā)現(xiàn)了這個(gè)空,它跟 Objective-C 中的 nil 有著顯著的區(qū)別,因?yàn)?Objective-C 中的 NSDictionary 是不允許某一個(gè) Key 對應(yīng)的 Value 為 nil的。 這個(gè)空,最終被轉(zhuǎn)化成了一個(gè) NSNull 對象。
那么 NSNull 究竟是什么?
NSNull: 有作沒有
NSNull 在 Foundation 框架中被廣泛使用,以解決 NSArray 和 NSDictionay 之類的集合不能有 nil 值的缺陷。我們可以將 NSNull 理解為 nil 在集合中的封裝,以達(dá)到在集合中表示“空”的目的:
NSMutableDictionary* mutableDictionary = [NSMutableDictionarydictionary];
mutableDictionary[@"someKey"] = [NSNullnull];
NSLog(@"Keys: %@",[mutableDictionaryallKeys]);// @[@"someKey"]
nil / Nil / NULL / NSNull
Objective-C 中有四種不同的空值,以下是這四種空值表達(dá)式的值和含義:

*PS: 我沒有找到簡書的表格功能,所以我用 MacDown 生成了這個(gè)表格并以截圖的形式放在這里,然而它并不清楚。如果你知道如何在簡書的文章中添加表格,麻煩留言告訴我,謝謝:)
共勉。:)