• 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 =@{@"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 自动转换为@“”;还没想好!

    更新:2016-09-30

    在swift 3.0 中可以存储nil 对象。不会再崩溃了。很好的完善。

  • 相关阅读:
    SQOOP的安装配置_Linux伊甸园开源社区24小时滚动更新开源资讯,全年无休!
    Cloudera's Hadoop Demo VM for CDH4 Cloudera Support
    海量文档查同或聚类问题 Locality Sensitive Hash 算法
    part 1: resemblance with the jaccard coefficient
    计算机科学中最重要的32个算法zz
    详细的tfidf构建过程实例(转)
    2012 Beijing Google Dev FastDay(11/03/2012) 移动新观察
    百度技术沙龙
    Hive官方手册翻译(Getting Started) 实践检验真理 51CTO技术博客
    《周末休闲吧》:教你如何玩车震——车震全程攻略!_周末休闲吧_百度空间
  • 原文地址:https://www.cnblogs.com/muyushifang07/p/5737564.html
Copyright © 2020-2023  润新知