美文网首页
如何安全的操作NSDictionary 、以及简写的特性

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

作者: 瞎编程 | 来源:发表于2019-01-28 17:36 被阅读10次

    先抛出结论:

    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 掉

    相关文章

      网友评论

          本文标题:如何安全的操作NSDictionary 、以及简写的特性

          本文链接:https://www.haomeiwen.com/subject/amiajqtx.html