iOS中nil、NSNULL、Nil

1、原由git

參與一個比較成熟的項目的開發,恰好項目新功能上線。結果上線4天奔潰2千個,我看了下倒吸一口涼氣。當時,最後排查出來是很簡單的緣由新用戶註冊時H5返回給iOS殼中<NULL>類型數據的處理不當致使於奔潰(不能給NULL類型發送消息)。這代碼要是我寫的我想可以我吹一生。換而言之,就是扼殺了那麼多用戶。咱們開發的一行代碼糟蹋了多少錢多少運營。雖然這牛逼的bug不是我出品,可是也是狠狠的給我上了一課,因此寫此篇博客警醒本身。github

2、重溫編程

1.基本概念數組

nil:Defines the id of a null instance(官方),指向一個(實例)對象的空指針。                      NULL:指向其餘類型(如:基本類型、C類型)的空指針
Nil:Defines the id of a null class(官方),指向一個類的空指針
NSNull:一般表示集合中的空值安全

nil和NULL指針

nil是指向對象的的指針,針對的是對象,咱們O-C是面向對象的東西。可是NULL是C類型的指針,C語言是一門面向過程的語言。NULL是c語言中指向基礎類型的指針,如int等針對的是數據。不要使用NULL去重置對象,可能會產生異常。當咱們將一個對象釋放掉的時候將對象置爲nil避免野指針。對象

nil和NSNULL開發

nil是O-C中針對於對象使用的,可是容器對象沒法包含nil,如集合、字典和數組。因此nil類型的值咱們使用NSNull來存儲。當咱們想給容器存nil類型的值時,不能直接將nil存儲進去,存儲nil類型到容器中會產生崩潰。setValuesForKeysWithDictionary和ditionaryWithValuesForKeys方法能夠將NSNull和nil相互轉換。不能給NSNULL類型發送消息,會發生崩潰。get

josn字符中的null經過NSJSONSerialization類轉換後,可能產生( null )或< null >類型,當咱們在O-C中使用對象去接受這些東西的時候,必定要進行安全判斷是否爲(null)或者<null>。我碰到的就是返回了<null>類型,使用了NSString接收後,將str傳遞給註冊方法的時候方法內部產生異常。咱們在寫代碼的過程當中爲了程序的健壯性對於須要進行判斷的必定不能生。雖然對於nil類型判斷沒有必要,由於給nil類型發送消息也不會崩潰,可是能夠提升代碼運行速度(http://xuzhe.com/?p=630)更能養成一個好的編程習慣,寫出更好的代碼。博客

咱們判斷是否有NSNULL類型數據的時候須要這樣判斷

針對<null>的狀況

if([result isEqual:[NSNUll null]]) { 

    NSLog(@"執行");

}

Nil

Nil是針對類對象的空,對此和nil發送消息不會產生崩潰。

3、一個很牛逼的方案

這次爲補充,寫完博客後就一直注意這方面的消息。在git上找到了一個很牛逼的第三方,能夠避免給NULL類型發消息致使的崩潰。即時你工程中有此崩潰,恭喜你,你如今不用苦苦排查此崩潰在何處,親測NULL致使的崩潰能夠避免,使用方式十分簡單。下載後倒入.m文件就能夠,。牛的一比,使用到了比較底層的技術,抽空在此補充分析下,先供上鍊接給有須要的人。幫助到的人感謝下我,把快樂傳遞下,謝謝哈

https://github.com/nicklockwood/NullSafe

相關文章
相關標籤/搜索