如何安全的操作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:是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 掉