如何安全的操作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]

先看文档,如下:


2369033-3c533e8ef4108f3b.png
setObject介绍

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

解析:setValue:之所以安全

先看文档,如下:

2369033-56a3e830d70bd10d.png
setValue介绍

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

解析:objectForKey:之所以安全

2369033-6743c6cad66980bf.png
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 掉

猜你喜欢

转载自blog.csdn.net/weixin_34319817/article/details/87077145