nil/Nil/NULL/NSNull的來歷

學(xué)過C的同學(xué)都知道殿漠,C是用0來表示不存在的原始值亥鬓。而NULL作為空指針傻寂,在指針環(huán)境中也相當(dāng)于0值息尺。其實NULL和0的值都是一樣的。但是為了目的和用途及容易識別的原因疾掰,NULL用于指針和對象搂誉,0用于數(shù)值。

NULL

要理解NULL首先得知道這么幾個概念:

  1. 什么是空指針常量(null pointer constant)?

    An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.

    上面這句話大概意思是說:值為0的整型常量表達式或者類型為void*的表達式則稱為空指針常量个绍。

  2. 什么是空指針(null pointer)?

    If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

    上面這句話表達的意思是:當(dāng)一個空指針常量被轉(zhuǎn)換為指針類型勒葱。這個指針不指向任何實際的對象或者函數(shù),則這個指針就稱為空指針巴柿。

    舉個例子:
    char *p = 0; 此時p就是一個空指針凛虽。它不指向任何實際對象。反過來說:任何實際的對象和函數(shù)的地址都不可能是空指針广恢。

  3. 空指針(null pointer)指向了內(nèi)存的什么地方(空指針的內(nèi)部實現(xiàn))凯旋?

    標(biāo)準(zhǔn)并沒有對空指針指向內(nèi)存中的什么地方這一個問題作出規(guī)定,也就是說用哪個具體的地址值(0x0 地址還是某一特定地址)表示空指針取決于系統(tǒng)的實現(xiàn)钉迷。常見的空指針一般指向 0 地址至非,即空指針的內(nèi)部用全 0 來表示(zero null pointer,零空指針)糠聪;在OC中空指針指向的地址為0x0荒椭。測試代碼如下:

    char *p = 0;
    printf("%p\n", p); // 0x0

了解了上面的幾個概念后我們再來看一看NULL的定義

在頭文件stddef.h中可以找到這么一句定義:

#define NULL ((void*)0)

由定義和上面的幾個概念可以看出NULL是一個值為0的空指針(本人認為),即可以這么認為:這個指針指向的地址為0x0舰蟆。也就是說這個指針不指向任何對象和函數(shù)趣惠。

nil

了解了NULL后,我們來看看nil,nil是Objective-C在C的表達不存在的基礎(chǔ)上增加的身害。nil是一個指向不存在的對象指針味悄。也就相當(dāng)于NULL,雖然兩者語義上不同塌鸯,但是技術(shù)上是相等的侍瑟。剛被分配內(nèi)存的NSObject的內(nèi)容都被設(shè)置為0,即都為空指針丙猬。nil有一個特別的行為就是涨颜,它雖然為零费韭,仍然可以向他發(fā)送消息。在nil上調(diào)用方法都返回一個零值咐低。測試代碼如下:

NSString *name;
   NSLog(@"%p  %hhd", name, [name isEqualToString:@"CoderKo1o"]); // 0x0 0

Nil

在蘋果官方文檔中揽思,可以看到這么一段定義

#define nil __DARWIN_NULL
#define Nil __DARWIN_NULL

由此可見:Nil和nil值是一樣的,那么他們有什么區(qū)別呢见擦?

nil

Defines the id of a null instance.

Nil

Defines the id of a null class.

上面這段描述相信一眼就能看出區(qū)別了:nil是指向0值的對象指針钉汗, Nil是指向0值的類指針,即就是為了用來區(qū)分是對象指針和類指針鲤屡。

NSNull

按照上面的說法损痰,每個東西都有存在的意義,當(dāng)然NSNull也有自身存在的價值酒来。NSNull在Foundation和其他框架中被廣泛地使用卢未。熟悉NSArray和NSDictionary之類的集合都知道,它們有一個nil值的缺陷堰汉,因為語法規(guī)定了這些集合是以nil為結(jié)束標(biāo)志的辽社。所以當(dāng)你想存儲一個值為空的對象。又不能使用nil(語法規(guī)定)翘鸭,這時候NSNull就派上用場了滴铅,NSNull可以理解為有效地對NULL或者nil值封裝成一個對象。在Foundation框架中的NSNull.h頭文件中可以發(fā)現(xiàn)NSNUll只有一個類方法+ (NSNull *)null;返回一個表示0值的單獨的對象,注意:這個對象指向的地址并不為0x0就乓。

總結(jié)

這里介紹的都是OC中用來表達沒有的值汉匙,也是在學(xué)習(xí)OC過程中不可忽視的,為了更直觀地表現(xiàn)這4個的值區(qū)別,這里列了一個表:

標(biāo)志 含義
NULL (void *)0 C中的空指針(值為0)
nil (id)0 Objective-C對象的空指針
Nil (Class)0 Objective-C類的空指針
NSNull [NSNull null] 用來表示零值的單獨的對象(并非空指針)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末生蚁,一起剝皮案震驚了整個濱河市噩翠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邦投,老刑警劉巖伤锚,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異志衣,居然都是意外死亡见芹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門蠢涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阅懦,你說我怎么就攤上這事和二。” “怎么了耳胎?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵惯吕,是天一觀的道長惕它。 經(jīng)常有香客問我,道長废登,這世上最難降的妖魔是什么淹魄? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮堡距,結(jié)果婚禮上甲锡,老公的妹妹穿的比我還像新娘。我一直安慰自己羽戒,他們只是感情好缤沦,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著易稠,像睡著了一般缸废。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驶社,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天企量,我揣著相機與錄音,去河邊找鬼亡电。 笑死届巩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逊抡。 我是一名探鬼主播姆泻,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冒嫡!你這毒婦竟也來了拇勃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤孝凌,失蹤者是張志新(化名)和其女友劉穎方咆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟀架,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瓣赂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了片拍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煌集。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捌省,靈堂內(nèi)的尸體忽然破棺而出苫纤,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布卷拘,位于F島的核電站喊废,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏栗弟。R本人自食惡果不足惜污筷,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乍赫。 院中可真熱鬧瓣蛀,春花似錦、人聲如沸耿焊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罗侯。三九已至器腋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钩杰,已是汗流浹背纫塌。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讲弄,地道東北人措左。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像避除,于是被迫代替她去往敵國和親怎披。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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