nil / Nil /NULL / NSNull區(qū)別

標(biāo)識(shí) 含義
Null (void*)0 C指針的字面零值
nil (id)0 ObjC對象的字面零值
Nil (Class)0 ObjC類的字面零值
NSNull [NSNull null] 用來表示零值的單獨(dú)對象

NOTICE: 蘋果的編譯器在編譯時(shí)會(huì)生成objc_msgSend這樣的方法來發(fā)送消息娘荡,當(dāng)對象設(shè)置為nil時(shí)灭翔,它就不會(huì)去尋找是哪個(gè)類實(shí)例的消息隙咸,因此什么也不干账千,這是蘋果的處理方式。

若obj為nil:[obj message]將返回NO,而不是NSException
若obj為NSNull:[obj message]將拋出異常NSException
nil绳军、Nil印机、NULL的使用對比

先看下面做的一個(gè)實(shí)驗(yàn):

NSArray * array = [NSArray arrayWithObjects:@"good", @"morning", nil];
// array = nil; // 輸出:0
// array = NULL; // 輸出:0
// array = Nil; // 輸出:0 

NSLog(@"%ld", array.count);// 分別使用上面三句注釋的語句,輸出值無區(qū)別


 Class class = [NSURL class];
// class = Nil; // 輸出:(null)
// class = nil; // 輸出:(null)
// class = NULL; // 輸出:(null) 

NSLog(@"%@", class); // 分別使用上面三句注釋的語句门驾,輸出值無區(qū)別 


int a = 10; int * p = &a;
// p = NULL; // 輸出:0x0
// p = nil; // 輸出:0x0// 
p = Nil; // 輸出:0x0 

NSLog(@"%p", p); // 分別使用上面三句注釋的語句射赛,輸出值無區(qū)別

結(jié)論:

  • nil、Nil奶是、NULL在使用上是沒有什么區(qū)別的楣责,但是程序員的一個(gè)約定:C結(jié)構(gòu)的指針使用NULL;對象指針使用nil聂沙;類對象指針使用Nil秆麸。
  • 另外NSNull和nil、Nil及汉、NULL具有本質(zhì)上的區(qū)別沮趣。NSNull是一個(gè)對象,而nil坷随、Nil房铭、NULL只是給指針賦空值驻龟。
  • 在另外,給一個(gè)賦值為nil的對象發(fā)送消息缸匪,不會(huì)產(chǎn)生異常翁狐。當(dāng)然給一個(gè)賦值為Nil、NULL的對象發(fā)送消息也不會(huì)產(chǎn)生異常凌蔬,這個(gè)在例子中已經(jīng)證實(shí)露懒。故根據(jù)此條結(jié)論的總結(jié)為:nil、Nil砂心、NULL目的都是給一個(gè)指針賦值為空隐锭,給空指針發(fā)送消息不會(huì)產(chǎn)生異常
NSNull 到底是個(gè)什么東西?我從來沒有調(diào)用過這個(gè)類计贰,那么它又是哪產(chǎn)生的?
  • 通過 search 和排查蒂窒,我最終定位了這個(gè)問題躁倒,這個(gè) NSNull 是由 AFNetworking 的一個(gè)函數(shù)回調(diào)產(chǎn)生的:
  • 我在取 responseObject 的某個(gè) value 時(shí),得到了一個(gè) NSNull 對象洒琢,而這個(gè)對象本應(yīng)該是一個(gè) NSString 的秧秉。
  • 通過與 PHP 服務(wù)器同學(xué)聯(lián)調(diào),我們最終發(fā)現(xiàn)了這個(gè)問題產(chǎn)生的原因衰抑。
  • 原來象迎,服務(wù)器同學(xué)在獲取某個(gè)字段的時(shí)候,不小心填錯(cuò)了參數(shù)呛踊,導(dǎo)致獲取到的字段為空砾淌。他將這個(gè)空作為這個(gè) Key 的 Value 填入了 JSON。
  • iOS APP 這邊谭网,AFNetworking 發(fā)現(xiàn)了這個(gè)空汪厨,它跟 Objective-C 中的 nil 有著顯著的區(qū)別,因?yàn)?Objective-C 中的 NSDictionary 是不允許某一個(gè) Key 對應(yīng)的 Value 為 nil的愉择。 這個(gè)空劫乱,最終被轉(zhuǎn)化成了一個(gè) NSNull 對象。

nil锥涕、Nil衷戈、NULL、NSNull之間的區(qū)別

nil的含義

指向一個(gè)對象的指針為空层坠,用于給對象指針賦值為空殖妇,防止野指針的產(chǎn)生;也稱nil為空對象:表示一個(gè)已經(jīng)被釋放了的對象窿春,和值為空的對象(NSNull)不同拉一。NSNull是一個(gè)對象采盒,只不過這個(gè)對象的值為空
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif

給對象指針賦值為空:

NSString * name = nil;
NSString * url = nil;
id object = nil;
Nil的含義

指向一個(gè)類的指針為空,用于給類對象指針賦值為空
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif

給類對象賦值為空:

Class class = Nil;
NULL的含義

指向C類型的指針蔚润,用于給C類型的指針賦值為空
#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
# if !defined(MINGW32) && !defined(_MSC_VER)
# define NULL __null
# else
# define NULL 0
# endif
#else
# define NULL ((void*)0)
#endif

給C類型指針賦值:

int * a = NULL;
char * ch = NULL;
struct aStruct = NULL;
NSNull的含義

NSNull是一個(gè)類磅氨,其繼承自NSObject,只擁有一個(gè)類方法嫡纠。實(shí)例對象表示這是一個(gè)內(nèi)容為空的對象烦租。主要用于數(shù)組、字典除盏。

NSMutableArray * mArray = [NSMutableArray array];

[mArray addObject:[NSNull null]];

NSLog(@"%@", [mArray firstObject]); // 輸出為:<null>


NSMutableDictionary * dict = [NSMutableDictionary dictionary];

[dict setObject:[NSNull null] forKey:@"null"];

NSLog(@"%@", dict[@"null"]); // 輸出為:<null>

由此可見叉橱,可用NSNull的實(shí)例對象在數(shù)組、字典中占位者蠕,其所占有的位置為空窃祝。

參考:http://www.reibang.com/p/562ecd82228f

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踱侣,隨后出現(xiàn)的幾起案子粪小,更是在濱河造成了極大的恐慌,老刑警劉巖抡句,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件探膊,死亡現(xiàn)場離奇詭異,居然都是意外死亡待榔,警方通過查閱死者的電腦和手機(jī)逞壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锐锣,“玉大人腌闯,你說我怎么就攤上這事〈滔拢” “怎么了绑嘹?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長橘茉。 經(jīng)常有香客問我工腋,道長,這世上最難降的妖魔是什么畅卓? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任擅腰,我火速辦了婚禮,結(jié)果婚禮上翁潘,老公的妹妹穿的比我還像新娘趁冈。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布渗勘。 她就那樣靜靜地躺著沐绒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旺坠。 梳的紋絲不亂的頭發(fā)上乔遮,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音取刃,去河邊找鬼蹋肮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛璧疗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崩侠,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼有送,長吁一口氣:“原來是場噩夢啊……” “哼僧家!你這毒婦竟也來了八拱?” 一聲冷哼從身側(cè)響起涯塔,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤匕荸,失蹤者是張志新(化名)和其女友劉穎榛搔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腹泌,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尔觉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年专甩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棺耍。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烈掠,死狀恐怖左敌,靈堂內(nèi)的尸體忽然破棺而出俐镐,到底是詐尸還是另有隱情,我是刑警寧澤叼风,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布无宿,位于F島的核電站孽鸡,受9級特大地震影響栏豺,放射性物質(zhì)發(fā)生泄漏奥洼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伏尼。 院中可真熱鬧尉尾,春花似錦、人聲如沸辨图。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理盆。三九已至凑阶,卻和暖如春宙橱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背师郑。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工张遭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留地梨,地道東北人湿刽。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓诈闺,卻偏偏與公主長得像铃芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子仁烹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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