最近在做項(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)想好帆阳!