NSNull 風(fēng)波
最近我開發(fā)的 iOS APP 通過友盟發(fā)現(xiàn)了一個新的崩潰柏肪,日志如下:
NSNull 到底是個什么東西?我從來沒有調(diào)用過這個類芥牌,那么它又是哪產(chǎn)生的烦味?
通過 search 和排查,我最終定位了這個問題,這個 NSNull 是由 AFNetworking 的一個函數(shù)回調(diào)產(chǎn)生的:?
我在取 responseObject 的某個 value 時谬俄,得到了一個 NSNull 對象柏靶,而這個對象本應(yīng)該是一個 NSString 的。
通過與 PHP 服務(wù)器同學(xué)聯(lián)調(diào)溃论,我們最終發(fā)現(xiàn)了這個問題產(chǎn)生的原因屎蜓。
原來,服務(wù)器同學(xué)在獲取某個字段的時候钥勋,不小心填錯了參數(shù)炬转,導(dǎo)致獲取到的字段為空。他將這個空作為這個 Key 的 Value 填入了 JSON算灸。
iOS APP 這邊扼劈,AFNetworking 發(fā)現(xiàn)了這個空,它跟 Objective-C 中的 nil 有著顯著的區(qū)別乎婿,因為 Objective-C 中的 NSDictionary 是不允許某一個 Key 對應(yīng)的 Value 為 nil的测僵。 這個空,最終被轉(zhuǎn)化成了一個 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 生成了這個表格并以截圖的形式放在這里良风,然而它并不清楚。如果你知道如何在簡書的文章中添加表格闷供,麻煩留言告訴我烟央,謝謝:)
共勉。:)