iOS 开发遇到的问题之(nil指针对NSDictionary及NSArray初始化的影响)

nil指针对NSDictionary及NSArray初始化的影响

最近在做项目的时候遇到一个挺坑的崩溃问题,是由于NSDictionary初始化时nil指针引起的崩溃。假设我们现在要初始化一个{key1 : value1, key2 : value2, key3 : value3}的NSDictionary,一般有两种初始化方法:

1、使用标准的初始化方法:

NSDictionary *dictionary =[[NSDictionaryalloc] 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 = [[NSDictionaryalloc]initWithObjectsAndKeys:value1,@"key1",value2,@"key2", value3 ,@"value3",nil];

如果我们把其中一个key或者value设为nil指针,那么系统会判断为全部对象插入完成,即相当于我们初始化数组及字典时最后的nil。因此这种方法虽然能避免插入nil指针时抛出的异常,但可能会成为一个工程中很大的安全隐患,并且难以发现。所以推荐使用第二种初始化方法,并对nil指针进行必要的判断,选择性使用[NSNull null]来实现特点的需求。同理,使用NSArray时也应该注意这类问题。

思考:想使用 {key1:value1,key2 "",key3:value3}  但是要判断没个value 不能为nil;相当麻烦。而使用,initWithObjectsAndKeys:value1;不会崩溃,但是 系统会认为是末尾的nil,造成参数不完整。调试时难以发现。

1.注意对变量初始化。

2.赋值操作时,对=号后面的对象判断。

其实想写个类别是想实现,对nil 校验,nil 自动转换为@“”;还没想好!

时间: 2024-08-07 22:51:31

iOS 开发遇到的问题之(nil指针对NSDictionary及NSArray初始化的影响)的相关文章

懒加载的用处和赋nil操作[iOS开发教程]

懒加载的用处和赋nil操作 1:数据,清空操作: self.array = nil; 2:归档从新从本地获取数据 self.archive = nil; ##id = nil的用处 block当参数,并在方法体中如下调用 safe block版本 <#block#> ? <#block#>() : nil; 或进阶版本:safe block 加 绑定代码版本 if(<#block#>) { <#block#>(); <#Code:在请求成功后同时进行的

iOS开发——面试篇&amp;OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的

iOS开发 -文件下载(3 进度条)

一.实现下载文件进度控制 1.代码示例 1 #import "YYViewController.h" 2 3 @interface YYViewController () 4 @property(nonatomic,strong)NSMutableData *fileData; 5 @property(nonatomic,strong)NSFileHandle *writeHandle; 6 @property(nonatomic,assign)long long currentLen

iOS开发 -文件下载(4 暂停和恢复)

iOS开发网络篇—文件下载(四·暂停和恢复) 一.Range简单说明 通过设置请求头Range可以指定每次从网路下载数据包的大小 Range示例 bytes=0-499 从0到499的头500个字节 bytes=500-999 从500到999的第二个500字节 bytes=500- 从500字节以后的所有字节 bytes=-500 最后500个字节 bytes=500-599,800-899 同时指定几个范围 Range小结 - 用于分隔 前面的数字表示起始字节数 后面的数组表示截止字节数,没

iOS开发-定制多样式二维码

iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常见的二维码功能包括信息获取.网站跳转.电商交易.手机支付等等,其拥有密度小.信息容量大.容错能力强.成本低.制作难度低等优点.在移动开发中,二维码的地位也越来越重要,掌握二维码的基本操作是重要的本领之一. 在iOS7之后,苹果自身集成了二维码的生成和读取功能.生成二维码包括以下步骤 1.导入CoreIm

iOS开发UI篇—UITableviewcell的性能优化和缓存机制

iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每?行 UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图 辅助指示视图的作?是显示一个表示动作的

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

iOS开发系列--让你的应用“动”起来

--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CALayer常用属性 CALayer绘图 C

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa