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

由于今天在NSDictionary初始化的时候出现Crash异常,故记录一下,避免下次再犯。

在Objective-C中,NSDictionary初始化的方法有很多种

方法1: [NSDictionary dictionaryWithObjectsAndKeys:<#(id), ...#>, nil]

方法2: NSDictionary *dic = @{@"key":value}

那么,坑在哪里呢?就在第二种初始化方法 NSDictionary *dic = @{@"key":value}

那它到底是如何坑的呢?

如果value是nil 的话,必将引发Crash崩溃:‘NSInvalidArgumentException‘, reason: ‘*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]。意思就是说使用[__NSPlaceholderDictionary initWithObjects:forKeys:count:]这个初始化方法,发现keys count和objcects的个数不匹配了

那该如何避免这个问题呢?

在使用@{@”key”:value} 这种方式初始化的时候,一定要对value做是否为nil的判断,为nil就不要加入Dictionary

或者使用标准的初始化方法:NSDictionary dictionaryWithObjectsAndKeys:value1,@"v1",value2,@"v2",value3,@"v3", nil];或其它的几个初始化方法进行初始化,这样如果value为nil就不会加入字典,使用 objectForKey:取出来的对象就会为nil对象,不会引发崩溃。

注意:使用@[]方法初始化NSArray也有此坑,规避方法同字典一样。

时间: 2024-10-18 11:31:09

NSDictionary初始化,使用@{}方法,插入nil时会报空指针异常的相关文章

setOnClickListener报空指针异常

1.异常提示: 2.错误原因: 先看代码: public class MainActivity extends ActionBarActivity { private Button btn_test; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_test =

List列表排序报空指针异常

在项目中,想对列表数据按照日期字段排序,使用List.sort(Comparator c)方法,却总是报空指针异常. 通过网上查询,得知该问题应该是List中有null值引起的.即ArrayList中的数组长度默认为10,如果对其添加值个数小于10,就会有null值存在.而sort()方法会遍历每个对象取该对象的日期字段,当对象为null时再取其日期字段值自然会报空指针异常. 下面是网友的解决方法,新建一个同类型的ArrayList来装null,然后再从原List中removeAll该新List

iOS之NSDictionary初始化的坑

最近在做项目的时候遇到一个挺坑的崩溃问题,是由于NSDictionary初始化时nil指针引起的崩溃.假设我们现在要初始化一个{key1 : value1, key2 : value2, key3 : value3}的NSDictionary,一般有两种初始化方法: 1.使用标准的初始化方法: NSDictionary *dictionary =[[NSDictionary alloc] initWithObjectsAndKeys:value1,@"key1",value2,@&qu

CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to &amp;#39;next&amp;#39;错调试

CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封装到了luaoc类中,大体能够看成: luaoc.callStaticMethod = CCLuaObjcBridge.callStaticMethod 函数原型例如以下: --[[ 调用Objective-C中的静态方法 @param string className 类名 @param string me

解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: ‘\xE5\xB0\x8F\xE6\x98\x8E‘ for column ‘name‘ at row 1

原文:解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1 报错内容: mysql> insert into person values (1,22,'小明');ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for colum

[Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method &#39;xxx&#39;

在android4.2以前,注入步骤如下: webview.getSetting().setJavaScriptEnable(true); class JsObject { public String toString() { return "injectedObject"; } } webView.addJavascriptInterface(new JsObject(), "injectedObject"); Android4.2及以后,注入步骤如下: webv

重写NSArray与NSDictionary的descriptionWithLocale方法

重写NSArray的descriptionWithLocale方法: NSArray+log.h #import <Foundation/Foundation.h> @interface NSArray (log) @end NSArray+log.m #import "NSArray+log.h" @implementation NSArray (log) - (NSString *)descriptionWithLocale:(id)locale { NSMutable

Myeclipse下JSP打开报空指针异常解决方法。

Myeclipse下JSP打开报空指针异常解决方法 一.运行JSP文件就出错 静态的JSP页面访问时候正常,只要是牵涉到数据库的页面就出错,出错见下图. 出现这种情况让我调试了一天,各种断点,各种改代码,改数据库连接等等都试过都没有解决…… 二.解决方法 不经意间运行的时候选择了安装的tomcat 运行,一下就出来了!!!!! 把之前的改动都恢复到原来出错的时候,发现也可以正常运行,我去,,,,,忙活了大半天原来代码没有问题. >>>>>>>>>>

Xcode bug: imageNamed:方法返回nil

imageNamed:方法返回nil往往有以下几种情况: 项目不存在该图片: 图片命名不正确: 图片的后缀名有问题(往往使用.png的图片,使用.jpg后缀的图片可能会出问题): 设备使用的是Retina屏幕,但是项目没有提供相应的@2x图片: 排除了以上几种常见情况,我的imageNamed:方法仍然返回nil. 最后,把应用从simulator中卸载,退出simulator,关闭并重新启动Xcode,clean项目,重新编译,运行!悲剧的还是不行. 难道是编辑器出问题了?于是,我把代码注释了