iOS崩潰大掃除—NullSafe解決null崩潰

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0xcf3238
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70

什么場景下會遇到null呢锹引?

nil/Nil/null/NSNull全解
1、解析 JSON 數(shù)據(jù)時助隧。因為在后端數(shù)據(jù)庫里面筑凫,默認數(shù)據(jù)為 null 滑沧,如果修過數(shù)據(jù)后,又刪除巍实,那么數(shù)據(jù)庫會自動補充上 null 滓技。在接口返回數(shù)據(jù)時,就會把 NSNull 傳給我們棚潦,解析出來就是 null 空對象令漂。后端也可以做些調(diào)整,修改默認數(shù)據(jù)的方式:在創(chuàng)建表的時候丸边,添加上 'not null default' 叠必。
2、項目中為了向字典妹窖、數(shù)組纬朝、集合等存入空值,會使用到 NSNull 骄呼,在讀取時共苛,會讀取到 null 。

當我們給一個 null( NSNull 對象)發(fā)送消息的話蜓萄,很大可能會直接Crash( null 是有內(nèi)存的)隅茎,而發(fā)送給nil的話,是不會崩潰的绕德。

解決方案

1患膛、對可能出現(xiàn)空的字段進行非空判斷

會造成 Crash 的字段解析成的對象是 NSNull 類型的,所以可以直接判斷是不是此類型耻蛇,這樣的字段會比較多所以也會比較繁瑣踪蹬,也容易遺漏,但是也比較保險臣咖。

if (![object isKindOfClass:[NSNull class]]){
.....
}

2跃捣、字符串匹配, 替換 null 為 為空字符 ""

在獲取到服務器返回的 JSON 時,返回結(jié)果時 string 對象夺蛇,于是就先替換 null 為 為空字符""疚漆,然后再解析可避免 Crash 問題,這種方法比較巧妙刁赦,但若服務器的數(shù)據(jù)不太整潔也會有一定的問題娶聘。

json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];

3、解析數(shù)據(jù)時把 NSNull 類型的值替換成 nil

使用宏定義甚脉。

#define VerifyValue(value)\
({id tmp;\
if ([value isKindOfClass:[NSNull class]])\
tmp = nil;\
else\
tmp = value;\
tmp;\
})\

在解析數(shù)據(jù)時丸升,把接收到的 NSNull 類型的值替換成 nil 。

contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);

4牺氨、使用 AFNetworking 提供的方法

如果是使用 AFNetworking 這個庫做網(wǎng)絡請求的話狡耻,可以用以下代碼墩剖,自動幫你去掉空值

self.removesKeysWithNullValues = YES;

5、第三方庫 NullSafe

NullSafe 是一個 Category 夷狰,在運行時操作岭皂,把這個討厭的空值置為 nil ,而 nil 是安全的沼头,可以向 nil 對象發(fā)送任何 message 而不會 Crash 爷绘,其原理便是使用消息轉(zhuǎn)發(fā)機制實現(xiàn)。只需要將文件 nullSafe.m 導入工程便可以瘫证,無需引用頭文件等揉阎。 消息轉(zhuǎn)發(fā)原理淺析

附: NullSafe 的工作原理

當我們給一個 NSNull 對象發(fā)送消息的話庄撮,可能會崩潰( null 是有內(nèi)存的)背捌,而發(fā)送給 nil 的話,是不會崩潰的洞斯。發(fā)送給 NSNull 而 NSNull 又無法處理的消息要經(jīng)過如下幾步做轉(zhuǎn)發(fā)處理:

  1. 創(chuàng)建一個方法緩存毡庆,這個緩存會緩存項目中類的所有類名。
  2. 遍歷緩存烙如,尋找是否已經(jīng)有可以執(zhí)行此方法的類么抗。
  3. 如果有的話,返回這個 NSMethodSignature 亚铁。
  4. 如果沒有的話蝇刀,返回 nil , 接下來會走 forwardInvocation:方法。
  5. [invocation invokeWithTarget:nil]; 將消息轉(zhuǎn)發(fā)給 nil徘溢。

那么吞琐,如何判斷NSNull無法處理這個消息呢,在OC中然爆,系統(tǒng)如果對某個實例發(fā)送消息之后站粟,它(及其父類)無法處理(比如,沒有這個方法等)曾雕,系統(tǒng)就會發(fā)送 methodSignatureForSelector 消息奴烙,如果這個方法返回非空,那么就去執(zhí)行返回的方法剖张,如果為 nil, 則發(fā)送 forwardInvocation 消息切诀。這樣就完成整個轉(zhuǎn)發(fā)鏈了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔弄,一起剝皮案震驚了整個濱河市幅虑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肯污,老刑警劉巖翘单,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨枉,死亡現(xiàn)場離奇詭異,居然都是意外死亡哄芜,警方通過查閱死者的電腦和手機貌亭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來认臊,“玉大人圃庭,你說我怎么就攤上這事∈纾” “怎么了剧腻?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涂屁。 經(jīng)常有香客問我书在,道長,這世上最難降的妖魔是什么拆又? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任儒旬,我火速辦了婚禮,結(jié)果婚禮上帖族,老公的妹妹穿的比我還像新娘栈源。我一直安慰自己,他們只是感情好竖般,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布甚垦。 她就那樣靜靜地躺著,像睡著了一般涣雕。 火紅的嫁衣襯著肌膚如雪艰亮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天胞谭,我揣著相機與錄音垃杖,去河邊找鬼。 笑死丈屹,一個胖子當著我的面吹牛调俘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旺垒,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼彩库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了先蒋?” 一聲冷哼從身側(cè)響起骇钦,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竞漾,沒想到半個月后眯搭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窥翩,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年鳞仙,在試婚紗的時候發(fā)現(xiàn)自己被綠了寇蚊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡棍好,死狀恐怖仗岸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情借笙,我是刑警寧澤扒怖,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站业稼,受9級特大地震影響盗痒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盼忌,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一积糯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谦纱,春花似錦、人聲如沸君编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃嘿。三九已至祠乃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兑燥,已是汗流浹背亮瓷。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留降瞳,地道東北人嘱支。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像挣饥,于是被迫代替她去往敵國和親除师。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前言:面試筆試都是必考語法知識點扔枫。請認真復習和深入研究OC汛聚。 目錄:iOS-面試題-OC基礎篇 (1) - (84...
    麥穗0615閱讀 4,263評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)短荐,斷路器倚舀,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 目錄: 在字符串查看指定字符串 UILabel自適應 服務器數(shù)據(jù)處理 copy解釋 對象及可變字典賦值取值方法 n...
    Ryan___閱讀 751評論 0 0
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉叹哭,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,734評論 0 9
  • 凌晨十二點 窗外的風 沒有入眠 輕輕的哀泣聲 是在思念著誰 冬天的夜 是愛人的心 月光正好,卻 依然看不清 前方的...
    墨凡MF閱讀 310評論 0 0