nil指針對(duì)NSDictionary及NSArray初始化的影響

最近在做項(xiàng)目的時(shí)候遇到一個(gè)挺坑的崩潰問(wèn)題霹肝,是由于NSDictionary初始化時(shí)nil指針引起的崩潰。假設(shè)我們現(xiàn)在要初始化一個(gè){key1 : value1, key2 : value2, key3 : value3}的NSDictionary,一般有兩種初始化方法:

1、使用標(biāo)準(zhǔn)的初始化方法:

NSDictionary *dictionary =[[NSDictionaryalloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key2", value3 ,@"value3",nil];

2、使用ios6.0以后新支持的初始化方法:

NSDictionary *dictionary =@{@"key1" : value1,@"key2" : value2,@"key3" : value3};

現(xiàn)在我們對(duì)value1 value2 value3進(jìn)行賦值兰吟,并把value2設(shè)為nil指針:

NSString *value1 =@"value1";NSString *value2 =nil;NSString *value3 =@"value3";

這時(shí)如果使用第二種初始化方法,運(yùn)行程序會(huì)發(fā)現(xiàn)崩潰茂翔,日志如下:

DictionaryTextDemo[29390:1329578]Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]'

發(fā)現(xiàn)系統(tǒng)會(huì)阻止你向object[1]插入一個(gè)nil指針混蔼,查詢(xún)蘋(píng)果官方文檔得到

Discussion

This method steps through the objects andkeys arrays, creating entries in the new dictionary as it goes. AnNSInvalidArgumentException is raised if a key or value object isnil.

也就是說(shuō)使用這種初始化方法的時(shí)候必須保證key跟value都不為nil,因此我們需要在初始化之前對(duì)其進(jìn)行判斷珊燎,如果為nil就不加入字典惭嚣。但是如果有需求讓value必須為空的時(shí)候,可以將value賦值為[NSNull null]這樣就可以成功插入字典悔政,最后打印出來(lái)的結(jié)果是

DictionaryTextDemo[29510:1338517] dictionary : {key1 = value1;key2 = "";value3 = value3;}

另一種解決方法就是使用標(biāo)準(zhǔn)的初始化方法晚吞,即第一種初始化方法。但同時(shí)也要注意一個(gè)問(wèn)題谋国,使用

NDictionary *dictionary = [[NSDictionaryalloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key2", value3 ,@"value3",nil];

如果我們把其中一個(gè)key或者value設(shè)為nil指針槽地,那么系統(tǒng)會(huì)判斷為全部對(duì)象插入完成,即相當(dāng)于我們初始化數(shù)組及字典時(shí)最后的nil烹卒。因此這種方法雖然能避免插入nil指針時(shí)拋出的異常闷盔,但可能會(huì)成為一個(gè)工程中很大的安全隱患,并且難以發(fā)現(xiàn)旅急。所以推薦使用第二種初始化方法逢勾,并對(duì)nil指針進(jìn)行必要的判斷,選擇性使用[NSNull null]來(lái)實(shí)現(xiàn)特點(diǎn)的需求藐吮。同理溺拱,使用NSArray時(shí)也應(yīng)該注意這類(lèi)問(wèn)題。

思考:想使用?{key1:value1,key2 "",key3:value3} ?但是要判斷沒(méi)個(gè)value 不能為nil;相當(dāng)麻煩谣辞。而使用迫摔,initWithObjectsAndKeys:value1;不會(huì)崩潰泥从,但是 系統(tǒng)會(huì)認(rèn)為是末尾的nil,造成參數(shù)不完整句占。調(diào)試時(shí)難以發(fā)現(xiàn)。

1.注意對(duì)變量初始化躯嫉。

2.賦值操作時(shí)纱烘,對(duì)=號(hào)后面的對(duì)象判斷。

其實(shí)想寫(xiě)個(gè)類(lèi)別是想實(shí)現(xiàn)祈餐,對(duì)nil 校驗(yàn)擂啥,nil 自動(dòng)轉(zhuǎn)換為@“”;還沒(méi)想好帆阳!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哺壶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌山宾,老刑警劉巖至扰,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塌碌,居然都是意外死亡渊胸,警方通過(guò)查閱死者的電腦和手機(jī)旬盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)台妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胖翰,你說(shuō)我怎么就攤上這事接剩。” “怎么了萨咳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵懊缺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我培他,道長(zhǎng)鹃两,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任舀凛,我火速辦了婚禮俊扳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猛遍。我一直安慰自己馋记,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布懊烤。 她就那樣靜靜地躺著梯醒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腌紧。 梳的紋絲不亂的頭發(fā)上茸习,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音壁肋,去河邊找鬼号胚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛墩划,可吹牛的內(nèi)容都是我干的涕刚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乙帮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杜漠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驾茴,失蹤者是張志新(化名)和其女友劉穎盼樟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锈至,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晨缴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峡捡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击碗。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖们拙,靈堂內(nèi)的尸體忽然破棺而出稍途,到底是詐尸還是另有隱情,我是刑警寧澤砚婆,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布械拍,位于F島的核電站,受9級(jí)特大地震影響装盯,放射性物質(zhì)發(fā)生泄漏坷虑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一埂奈、第九天 我趴在偏房一處隱蔽的房頂上張望迄损。 院中可真熱鬧,春花似錦挥转、人聲如沸海蔽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)党窜。三九已至,卻和暖如春借宵,著一層夾襖步出監(jiān)牢的瞬間幌衣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工壤玫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豁护,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓欲间,卻偏偏與公主長(zhǎng)得像楚里,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猎贴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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