如何安全的操作NSDictionary 、以及简写的特性

先抛出结论:

1、安全赋值:setValue:或简写赋值

2、安全取值:objectForKey:或简写取值

使用场景:

1、可变字典可以调用setValue:方法给自身添加键值对,不可变字典调用setValue:语法上通过但是会crash

2、仅可变字典可以调用setObject:方法给自身添加键值对

3、仅可变字典可以使用简写(dic[@"XXX"] = @"XXX")给自身添加键值对

特殊赋值:

1、调用setObject:时,value不能为nil或者NULL,但可以是[NSNull null]

2、调用setValue:方法时value可以是NSString类型、nil、NULL

3、简写赋值时,value可以为任意类型(包括nil和NULL)

特殊取值:

1、当使用valueForKey:取值时,key必须符合OC类属性命名规范(如果key = @"@ds",会造成crash)

2、objectForKey:不对key格式做限定

3、简写取值同样不对key格式做限定

崩溃场景:

1、对不可变字典使用setValue:

2、使用valueForKey:方法时,key不符合OC类属性命名规范

解析:setObject:不能接受nil和NULL但可以接受[NSNull null]

先看文档,如下:


setObject介绍

可以发现setObject:是set了一个对象类型的数据。

解析:setValue:之所以安全

先看文档,如下:

setValue介绍

可以看到setValue:最后还是调用了setObject:但是当这个value为nil的时候,则自动调用removeObjectForkey:

解析:objectForKey:之所以安全

objectForKey介绍

objectForKey: returns the value associated with aKey, or nil if no value is associated with aKey. 返回指定 key 的 value,若没有这个 key 返回 nil.

解析:为何valueForKey:取值时,key必须符合OC类属性命名规范

valueForKey: 是 KVC(NSKeyValueCoding) 的方法,在 KVC 里可以通过 property 同名字符串来获取对应的值,找和指定 key 同名的 property accessor,没有的时候执行 valueForUndefinedKey,而 valueForUndefinedKey:的默认实现是抛出 NSUndefinedKeyException 异常

当你的key包含字符,valueForKey会先帮你去除特殊字符,在这样就在字典里找不到对应的key,抛出 NSUndefinedKeyException 异常后 crash 掉

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 源码加翻译 #import <Foundation/NSArray.h> #import <Foundation/...
    CAICAI0阅读 1,175评论 0 50
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    我的梦工厂阅读 901评论 1 8
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 关键词/关键类 1.#import跟#include有什么区别,@class呢,#import<>跟#import...
    丶逐渐阅读 1,471评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,767评论 0 9