最近在做项目的时候遇到一个挺坑的崩溃问题,是由于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[:] 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[:] 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时也应该注意这类问题。
 

iOS之NSDictionary初始化的坑的更多相关文章

  1. NSDictionary初始化,使用@{}方法,插入nil时会报空指针异常

    由于今天在NSDictionary初始化的时候出现Crash异常,故记录一下,避免下次再犯. 在Objective-C中,NSDictionary初始化的方法有很多种 方法1: [NSDictiona ...

  2. ios 集成阿里百川的坑-【SDK初始化-iOS】读取身份图片AppKey失败

    最简易方法调用淘宝app: 引用文件 #import <AlibcTradeSDK/AlibcTradeSDK.h> AlibcWebViewController* view = [[Al ...

  3. iOS推送的众多坑

    新来的一家公司,昨天和同事解决推送问题(工程里有集成百度推送和环信即时通讯),信誓旦旦的声称:" app在前台和后台运行时,推送触发的是didReceiveRemoteNotificatio ...

  4. IOS字典NSDictionary与NSMutableDictionary知识点

    字典中的元素是以键值对的形式存储的,键值对的键和值,都是任意的对象,但是键往往使用字符串,字典存储对象的地址没有顺序,字典的遍历分为:键的遍历和值的遍历,字典与数组的区别:数组讲究顺序,而字典可以快速 ...

  5. iOS - 字典(NSDictionary)

    1. 字典类型的常用处理 //---------------不可变字典 //1.字典的创建 NSArray *array1 = [NSArray arrayWithObjects:@"zha ...

  6. Unity发布至IOS的流程(踩坑记录)

    这篇文章主要用于记录本人亲身经历过的Unity发布到IOS平台所遇到的所有坑(其实也就是一些自己并不明白的强制设定),以便于后续再有类似需求时少走些弯路. 我的环境: Unity 5.2.2 个人版( ...

  7. iOS Swift开发的一些坑

    0.人难招,特别是对于没钱的小团队,大多数的iOS开发者没有Swift经验,有经验的也并不是很深入 0.1.语言unwrap坑,虽然有自动修正提示,但感觉代码过程不流畅. 1.Realm的缺憾: 最近 ...

  8. iOS支付宝SDK回调那坑

    支付宝钱包支付接口开发包2.0标准版(iOS 2.2.1) ,回调不出来,demo给出的方法是: - (BOOL)application:(UIApplication *)application op ...

  9. IOS Intro - NSDictionary and NSMutableDictionary

    NSDictionary.NSMutableDictionary的基本用法 1.不可变词典NSDictionary 字典初始化 NSNumber *numObj = [NSNumber numberW ...

随机推荐

  1. <Android 基础(十九)> CoordinatorLayout

    介绍 CoordinatorLayout,中文翻译,协调布局,顾名思义,此布局中的子View之间,子View与父布局之间应该是可以协调工作的,如何协调,Behavior. 今天看下Android St ...

  2. Java 之数组(4)

    什么是数组: 问:编写代码保存 4 名学生的考试成绩. 答:简单啊,定义 4 个变量呗 问:那“计算全年级 400 名学生的考试成绩”,肿么办 答: ....... 数组,就可以帮助你妥妥的解决问题啦 ...

  3. SMBus Host Controller not enabled!

    今天去官网下载最新的ubuntu  ubuntukylin-16.10-desktop-amd64.iso,下载后vm 运行,安装后结果报了这个问题 之后google搜索得到答案: 1.复制   cp ...

  4. python mysql安装

    本文主要介绍不同系统mysql安装 mac安装mysql http://blog.csdn.net/pansanday/article/details/54915916   linux安装mysql ...

  5. redis基本操作命令

    前面我们看了redis的简介安装和数据类型,接下来介绍一下redis基本数据类型的操作命令: 一:redis键值对的管理和操作 DEL key 该命令用于在 key 存在时删除 key. DUMP k ...

  6. drag与drop事件

    为了支持网页上一些元素的拖动效果,可以使用drag和drog事件. 目前ie 5.0+, firefox 3.5+等都支持这些事件,ECMA Script第5版正式将其纳入标准. 对于被拖动的元素来说 ...

  7. 【Leetcode】【Medium】Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. mongo 聚合函数

    一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...

  9. [EffectiveC++]item37:绝不重新定义继承而来的缺省参数值

    绝不重新定义继承而来的缺省参数值 静态类型 动态类型

  10. 薄弱的交互页面之新浪微博到博客的储存型xss漏洞

    首先分享一片博文到微博,然后 在微博评论xss code 最后回到博客点击举报就触发xss了 点击举报 Xss之2 首先还是分享一片博文到微博,然后评论xsscode 回到我的博客个人中心,查看评论 ...