2018-10-10 野指針和空指針

野指針訪問不可用內(nèi)存地址 該內(nèi)存已被收回 不在屬于該應(yīng)用
空指針 指向null

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

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

關(guān)于nil

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

不過這里有必要提一點就是OC中給空指針發(fā)消息不會崩潰的語言特性,原因是OC的函數(shù)調(diào)用都是通過objc_msgSend進行消息發(fā)送來實現(xiàn)的,相對于C和C++來說赘那,對于空指針的操作會引起Crash的問題刑桑,而objc_msgSend會通過判斷self來決定是否發(fā)送消息,如果self為nil募舟,那么selector也會為空祠斧,直接返回,所以不會出現(xiàn)問題拱礁。

這里補充一點琢锋,如果一個對象已經(jīng)被釋放了,那么這個時候再去調(diào)用方法肯定是會Crash的呢灶,因為這個時候這個對象就是一個野指針了吴超,安全的做法是釋放后將對象重新置為nil,使它成為一個空指針鸯乃,大家可以在關(guān)閉ARC后手動release對象驗證一下鲸阻。(2016.05.24補)

    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");
    }

上面的兩種判斷都是正確的,我們不必擔(dān)心當(dāng)name為nil時調(diào)用isEqualToString會出現(xiàn)Crash飒责,但是我還是想說赘娄,在使用一個對象之前判斷它是否為nil是一個很好的習(xí)慣,個人覺得有兩個原因:

  1. 降低時間復(fù)雜度(感覺可以這么說吧)宏蛉,如果你增加了nil的判斷,那么不需要對空指針發(fā)送消息了性置,發(fā)消息其實是件費時的操作拾并。詳情可以看這里
  2. 把判斷為空養(yǎng)成習(xí)慣其實是好事,這樣在你切換語言時也不容易出錯鹏浅。

關(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對象季希,可能會產(chǎn)生一些異常的錯誤褪那,要使用nil,NULL主要針對基礎(chǔ)數(shù)據(jù)類型式塌。

關(guān)于Nil

Nil的定義是null pointer to object-c class博敬,指的是一個類指針為空。本質(zhì)就是(class)0峰尝,OC類的字面零值偏窝。

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

關(guān)于NSNull

NSNull好像沒有什么具體的定義(懵),它包含了唯一一個方法+(NSNull)null,[NSNull null]是一個對象祭往,用來表示零值的單獨的對象伦意。*

   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é)尾判斷的硼补,所以如果想插入一個空的對象就不能使用nil默赂,NSMutableDictionary也是類似,我們不能使用nil作為一個object括勺,而要使用NSNull

總結(jié)

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

作者:北辰明
鏈接:http://www.reibang.com/p/2ea9c3f737ea
來源:簡書
簡書著作權(quán)歸作者所有奈辰,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乱豆,一起剝皮案震驚了整個濱河市奖恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宛裕,老刑警劉巖瑟啃,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揩尸,居然都是意外死亡蛹屿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門岩榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來错负,“玉大人,你說我怎么就攤上這事勇边∮倘觯” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵粒褒,是天一觀的道長识颊。 經(jīng)常有香客問我,道長奕坟,這世上最難降的妖魔是什么祥款? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮执赡,結(jié)果婚禮上镰踏,老公的妹妹穿的比我還像新娘。我一直安慰自己沙合,他們只是感情好奠伪,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布跌帐。 她就那樣靜靜地躺著,像睡著了一般绊率。 火紅的嫁衣襯著肌膚如雪谨敛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天滤否,我揣著相機與錄音脸狸,去河邊找鬼。 笑死藐俺,一個胖子當(dāng)著我的面吹牛炊甲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欲芹,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼卿啡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菱父?” 一聲冷哼從身側(cè)響起颈娜,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浙宜,沒想到半個月后官辽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡粟瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年同仆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亩钟。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡乓梨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出清酥,到底是詐尸還是另有隱情,我是刑警寧澤蕴侣,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布焰轻,位于F島的核電站,受9級特大地震影響昆雀,放射性物質(zhì)發(fā)生泄漏辱志。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一狞膘、第九天 我趴在偏房一處隱蔽的房頂上張望揩懒。 院中可真熱鬧,春花似錦挽封、人聲如沸已球。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽智亮。三九已至忆某,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阔蛉,已是汗流浹背弃舒。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留状原,地道東北人聋呢。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像颠区,于是被迫代替她去往敵國和親削锰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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