關(guān)于OC中的nil, NULL詳解

原創(chuàng)文章轉(zhuǎn)載請注明出處,謝謝

關(guān)于OC中的nil, NULL詳解

我相信很多同學(xué)對于這四種表示空的方式肯定不會(huì)陌生了,網(wǎng)上也有不少介紹四種方式區(qū)別的囚衔,不過我還是想說一些自己的理解框往。

關(guān)于nil

nil的定義是null pointer to object-c object,指的是一個(gè)OC對象指針為空冶匹,本質(zhì)就是(id)0,是OC對象的字面0值

不過這里有必要提一點(diǎn)就是OC中給空指針發(fā)消息不會(huì)崩潰的語言特性咆瘟,原因是OC的函數(shù)調(diào)用都是通過objc_msgSend進(jìn)行消息發(fā)送來實(shí)現(xiàn)的嚼隘,相對于C和C++來說,對于空指針的操作會(huì)引起Crash的問題袒餐,而objc_msgSend會(huì)通過判斷self來決定是否發(fā)送消息飞蛹,如果self為nil,那么selector也會(huì)為空灸眼,直接返回卧檐,所以不會(huì)出現(xiàn)問題。

這里補(bǔ)充一點(diǎn)焰宣,如果一個(gè)對象已經(jīng)被釋放了霉囚,那么這個(gè)時(shí)候再去調(diào)用方法肯定是會(huì)Crash的,因?yàn)檫@個(gè)時(shí)候這個(gè)對象就是一個(gè)野指針了匕积,安全的做法是釋放后將對象重新置為nil盈罐,使它成為一個(gè)空指針,大家可以在關(guān)閉ARC后手動(dòng)release對象驗(yàn)證一下闪唆。(2016.05.24補(bǔ))

    NSString *name = @"Allen";
    
    if (name != nil && [name isEqualToString:@"Allen"]) {
        NSLog(@"name: %@", name);
    } else {
        NSLog(@"name is nil");
    }
    
    //or
    if ([name isEqualToString:@"Allen"]) {
        NSLog(@"name: %@", name);
    } else {
        NSLog(@"name is nil");
    }

上面的兩種判斷都是正確的暖呕,我們不必?fù)?dān)心當(dāng)name為nil時(shí)調(diào)用isEqualToString會(huì)出現(xiàn)Crash,但是我還是想說苞氮,在使用一個(gè)對象之前判斷它是否為nil是一個(gè)很好的習(xí)慣湾揽,個(gè)人覺得有兩個(gè)原因:

  1. 降低時(shí)間復(fù)雜度(感覺可以這么說吧),如果你增加了nil的判斷笼吟,那么不需要對空指針發(fā)送消息了库物,發(fā)消息其實(shí)是件費(fèi)時(shí)的操作。詳情可以看這里
  2. 把判斷為空養(yǎng)成習(xí)慣其實(shí)是好事贷帮,這樣在你切換語言時(shí)也不容易出錯(cuò)戚揭。

關(guān)于NULL

*NULL的定義是null pointer to primitive type or absence of data,指的是一般的基礎(chǔ)數(shù)據(jù)類型為空撵枢,可以給任意的指針賦值民晒。本質(zhì)就是(void )0精居,是C指針的字面0值。

  NSInteger *pointerA = NULL;
  NSInteger pointerB = 10;
  pointerA = &pointerB;
  NSLog(@"%ld", *pointerA);

我們要盡量不去將NULL初始化OC對象潜必,可能會(huì)產(chǎn)生一些異常的錯(cuò)誤靴姿,要使用nil,NULL主要針對基礎(chǔ)數(shù)據(jù)類型磁滚。

關(guān)于Nil

Nil的定義是null pointer to object-c class佛吓,指的是一個(gè)類指針為空。本質(zhì)就是(class)0垂攘,OC類的字面零值维雇。

    Class class = [NSString class];
    if (class != Nil) {
        NSLog(@"class name: %@", class);
    }

關(guān)于NSNull

NSNull好像沒有什么具體的定義(懵),它包含了唯一一個(gè)方法+(NSNull)null晒他,[NSNull null]是一個(gè)對象吱型,用來表示零值的單獨(dú)的對象。*

   NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
   NSString *nameOne = @"Allen";
   NSString *nameTwo = [NSNull null]; //not use nil
   NSString *nameThree = @"Tom";
   [dictionary setObject:nameOne forKey:@"nameOne"];
   [dictionary setObject:nameTwo forKey:@"nameTwo"];
   [dictionary setObject:nameThree forKey:@"nameThree"];
   NSLog(@"names: %@", dictionary);
   
   NSMutableArray *array = [[NSMutableArray alloc] init];
  [array addObject:nameOne];
  [array addObject:nameTwo];
  [array addObject:nameThree];
  NSLog(@"names : %@", array);

NSNull主要用在不能使用nil的場景下陨仅,比如NSMutableArray是以nil作為數(shù)組結(jié)尾判斷的津滞,所以如果想插入一個(gè)空的對象就不能使用nil,NSMutableDictionary也是類似掂名,我們不能使用nil作為一個(gè)object,而要使用NSNull

總結(jié)

其實(shí)這幾種空類型還是很好理解的哟沫,重要的是我們需要在平時(shí)的項(xiàng)目中也切實(shí)運(yùn)用起來饺蔑,不小心初始化的錯(cuò)誤可能導(dǎo)致一些難以發(fā)現(xiàn)的Bug。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗜诀,一起剝皮案震驚了整個(gè)濱河市猾警,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隆敢,老刑警劉巖发皿,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拂蝎,居然都是意外死亡穴墅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門温自,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玄货,“玉大人,你說我怎么就攤上這事悼泌∷勺剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵馆里,是天一觀的道長隘世。 經(jīng)常有香客問我可柿,道長,這世上最難降的妖魔是什么丙者? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任复斥,我火速辦了婚禮,結(jié)果婚禮上蔓钟,老公的妹妹穿的比我還像新娘永票。我一直安慰自己,他們只是感情好滥沫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布侣集。 她就那樣靜靜地躺著,像睡著了一般兰绣。 火紅的嫁衣襯著肌膚如雪世分。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天缀辩,我揣著相機(jī)與錄音臭埋,去河邊找鬼。 笑死臀玄,一個(gè)胖子當(dāng)著我的面吹牛瓢阴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播健无,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼荣恐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了累贤?” 一聲冷哼從身側(cè)響起叠穆,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼膏,沒想到半個(gè)月后硼被,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渗磅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年嚷硫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片始鱼。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡论巍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出风响,到底是詐尸還是另有隱情嘉汰,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布状勤,位于F島的核電站鞋怀,受9級(jí)特大地震影響双泪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜密似,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一焙矛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧残腌,春花似錦村斟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闺金,卻和暖如春逾滥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背败匹。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工寨昙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掀亩。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓舔哪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親槽棍。 傳聞我的和親對象是個(gè)殘疾皇子捉蚤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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