iOS之NSDictionary初始化的坑,iosnsdictionary

來源:互聯網
上載者:User

iOS之NSDictionary初始化的坑,iosnsdictionary

最近在做項目的時候遇到一個挺坑的崩潰問題,是由於NSDictionary初始化時nil指標引起的崩潰。假設我們現在要初始化一個{key1 : value1, key2 : value2, key3 : value3}的NSDictionary,一般有兩種初始化方法:

1、使用標準的初始化方法:

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

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

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

現在我們對value1 value2 value3進行賦值,並把value2設為nil指標:

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

這時如果使用第二種初始化方法,運行程式會發現崩潰,日誌如下:

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

發現系統會阻止你向object[1]插入一個nil指標,查詢蘋果官方文檔得到

DiscussionThis 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.

也就是說使用這種初始化方法的時候必須保證key跟value都不為nil,因此我們需要在初始化之前對其進行判斷,如果為nil就不加入字典。但是如果有需求讓value必須為空白的時候,可以將value賦值為[NSNull null]這樣就可以成功插入字典,最後列印出來的結果是

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

另一種解決方案就是使用標準的初始化方法,即第一種初始化方法。但同時也要注意一個問題,使用

NDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key2", value3 ,@"value3",nil];
如果我們把其中一個key或者value設為nil指標,那麼系統會判斷為全部對象插入完成,即相當於我們初始化數組及字典時最後的nil。因此這種方法雖然能避免插入nil指標時拋出的異常,但可能會成為一個工程中很大的安全隱患,並且難以發現。所以推薦使用第二種初始化方法,並對nil指標進行必要的判斷,選擇性使用 [NSNull null]來實現特點的需求。同理,使用NSArray時也應該注意這類問題。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.