iOS之NSDictionary初始化的坑
Posted Jaycee麦子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之NSDictionary初始化的坑相关的知识,希望对你有一定的参考价值。
最近在做项目的时候遇到一个挺坑的崩溃问题,是由于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 [email protected]{@"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指针,查询苹果官方文档得到
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.
也就是说使用这种初始化方法的时候必须保证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];
[NSNull null]
来实现特点的需求。同理,使用NSArray时也应该注意这类问题。以上是关于iOS之NSDictionary初始化的坑的主要内容,如果未能解决你的问题,请参考以下文章
IOS Intro - NSDictionary and NSMutableDictionary
IOS开发之——objectForKey与valueForKey在NSDictionary中的差异
IOS开发之----NSDictionary,JSON和XML互相转换
如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?