在iOS開發(fā)過程中經(jīng)常需要與服務(wù)器進(jìn)行數(shù)據(jù)通訊做盅,Json就是一種常用的高效簡潔的數(shù)據(jù)格式缤削。
問題現(xiàn)象
但是幾個(gè)項(xiàng)目下來一直遇到一個(gè)坑爹的問題,程序在獲取某些數(shù)據(jù)之后莫名崩潰吹榴。其實(shí)很早就發(fā)現(xiàn)了原因:由于服務(wù)器的數(shù)據(jù)庫中有些字段為空亭敢,然后以Json形式返回給客戶端時(shí)就會出現(xiàn)這樣的數(shù)據(jù):
"somevalue":null
通過JsonKit 這個(gè)第三方庫解析出來的數(shù)據(jù)就成了
somevalue = "";
這個(gè)數(shù)據(jù)類型不是nil 也不是 String。 解析成對象之后图筹,如果直接向這個(gè)對象發(fā)送消息(eg:length帅刀,count 等等)就會直接崩潰。提示錯(cuò)誤為:
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
解決方法
其實(shí)一直沒有找到完美的解決辦法远剩,坑了我很久扣溺。
1、最開始的解決方法就是為了應(yīng)付當(dāng)前遇到的崩潰瓜晤,看看哪個(gè)字段可能為空娇妓,那么就對該字段使用前進(jìn)行判斷,通過崩潰時(shí)的錯(cuò)誤提示可以看出活鹰,這樣的字段解析成的對象是 NSNull 類型的哈恰,所以可以直接判斷是不是此類型:
4、如果你使用AFNetwork 這個(gè)庫做網(wǎng)絡(luò)請求的話志群,可以用以下代碼着绷,自動幫你去掉這個(gè)討厭的空值
self.removesKeysWithNullValues = YES;
5、終極方案
終于找到了一勞永逸的方案锌云,牛逼的老外寫了一個(gè)Category荠医,叫做NullSafe ,在運(yùn)行時(shí)操作桑涎,把這個(gè)討厭的空值置為nil彬向,而nil是安全的,可以向nil對象發(fā)送任何message而不會奔潰攻冷。這個(gè)category使用起來非常方便娃胆,只要加入到了工程中就可以了,你其他的什么都不用做等曼,對里烦,就是這么簡單。詳細(xì)的請去Github上查看禁谦;
https://github.com/nicklockwood/NullSafe