背景:
服務(wù)返回的數(shù)據(jù)有可能會(huì)出現(xiàn),key:null 這種情形. 對(duì)于這種情況,提供三種思路處理. 同時(shí)歡迎提供其它更合適的方式處理
- 1.如果使用AFN框架可以 removesKeysWithNullValues
- 2.無論離散或者集約型網(wǎng)絡(luò)請(qǐng)求,應(yīng)該存在一個(gè)統(tǒng)一的返回 response 的地方, 可以在此集中處理,簡化的代碼可能如下
// 1. 接受到服務(wù)返回的 response
// 2. 序列化
// 3. 清除json中的null - 避免[NSNull null]導(dǎo)致的crash
json = [JSONUtils JSONObjectWithoutNull:json];
其中 JSONObjectWithoutNull:
的方法實(shí)現(xiàn)可以參考 JSONUtils
- 3.可以參考 NullSafe ,早在12年就已經(jīng)給出的解決方案>_<.
NuffSafe原理:
簡單點(diǎn)說,當(dāng)我們給一個(gè)NSNull對(duì)象發(fā)送消息的話矾兜,可能會(huì)崩潰(null是有內(nèi)存的),而發(fā)送給nil的話少孝,是不會(huì)崩潰的瓤荔。
作者就是使用了這么一個(gè)原理负拟,把發(fā)送給NSNull的而NSNull又無法處理的消息經(jīng)過如下幾步處理:
1.創(chuàng)建一個(gè)方法緩存,這個(gè)緩存會(huì)緩存項(xiàng)目中類的所有類名。
2.遍歷緩存屈暗,尋找是否已經(jīng)有可以執(zhí)行此方法的類妨蛹。
3.如果有的話屏富,返回這個(gè)NSMethodSignature。
4.如果沒有的話蛙卤,返回nil,接下來會(huì)走forwardInvocation:方法狠半。
5.[invocation invokeWithTarget:nil];將消息轉(zhuǎn)發(fā)給nil。
那么颤难,如何判斷NSNull無法處理這個(gè)消息呢神年,在OC中,系統(tǒng)如果對(duì)某個(gè)實(shí)例發(fā)送消息之后行嗤,它(及其父類)無法處理(比如已日,沒有這個(gè)方法等),系統(tǒng)就會(huì)發(fā)送methodSignatureForSelector消息栅屏,如果這個(gè)方法返回非空飘千,那么就去執(zhí)行返回的方法,如果為nil,則發(fā)送forwardInvocation消息既琴。
這樣就完成整個(gè)轉(zhuǎn)發(fā)鏈了占婉。
以上參考: NullSafe 的原理是什么?
最后, 希望這些對(duì)你有所幫助