美文网首页
NSMutableDictionary的[setObject:f

NSMutableDictionary的[setObject:f

作者: 喔牛慢慢爬 | 来源:发表于2019-11-04 13:53 被阅读0次

    setObject:forKey:setObject:forKeyedSubscript:的作用是相同的,这两个方法实现了同样的功能,都是是为了实现给dictionary添加键值对。

    1、setObject:forKey:

    方法声明:

    - (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

    参数详解:
    • anObject

    anObject是你要存入dictionary中的值,是aKey对应的值,该对象被dictionary强引用;
    注意:anObject的值不可以是nil,如果被置为nil,会引发NSInvalidArgumentException的异常崩溃,如果你想传入一个空值,可以使用NSNull代替;

    • aKey

    akeyanObject对应的key值,先检测dictionary中是否存在key对应的键值对,如果dictionary中存在了该key,则直接替换原有的value,否则就插入一条新键值对
    注意: 如果key为nil的话,会抛出NSInvalidArgumentException异常

    代码说明:
    • anObject为空,为dictionary插入空对象:
    1. 测试代码:
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    id objc = nil;
    [dict setObject:objc forKey:@"objc"];
    
    1. 结果:Crash

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: objc)'


    • anObject使用NSNull,为dictionary插入空对象:
    1. 测试代码:
    id objc = [NSNull null];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    
    1. 结果:

    {
    objc = "<null>";
    }


    • aKey为空:
    1. 测试代码:
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    id objc = @"AAAA";
    [dict setObject:objc forKey:nill];
    
    1. 结果:Crash

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: key cannot be nil'

    2、setObject:forKeyedSubscript:

    在iOS6.0之后,Apple引入了一套非正式协议与Objective-C语法直接绑定。当你实现了这其中的方法之后即可使用数组下标来访问属性元素。如数组使用@[ ]字典使用@{ }初始化、赋值、取值。

    方法声明:

    - (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key

    参数详解:
    • obj

    anObject是你要存入dictionary中的值,是aKey对应的值,该对象被dictionary强引用;
    注意:如果obj为空nil,dictonary会将key对应的obj移除;

    • key

    akeyanObject对应的key值。
    注意: 如果key为nil的话,会抛出NSInvalidArgumentException异常

    代码说明:
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    dict[@"name"] = @"Tom";
    //等效于[dict setObject:@"Tom" forKeyedSubscript:@"name"];
    dict[@"sex"] = nil;
    [dict setObject:@"23" forKeyedSubscript:@"age"];
    NSLog(@"dict:%@",dict); 
    NSLog(@"age:%@",dict[@"age"]);
    NSLog(@"name:%@,sex:%@",dict[@"name"],dict[@"sex"]);
    

    +打印结果:

    dict:{
        name = Tom;
    }
    age:23
    name:Tom,sex:(null)
    

    注意: 使用时可以无需调用setObject:forKeyedSubscript:方法,当使用下标赋值时,会调用该方法。

    总结:
    • 当调用setObject:forKey:value传入nil值时会导致崩溃;
    • 当调用setObject:forKeyedSubscript:value传入nil值时不会崩溃;
    • 当调用setObject:forKey:需要传入的value是nil时,可以使用NSNull;
    • 当使用下标赋值等效于调用setObject:forKeyedSubscript:方法,可以赋空值;
    • 无论setObject:forKey:还是setObject:forKeyedSubscript:key不能为空,如果传入空值都会崩溃;

    相关文章

      网友评论

          本文标题:NSMutableDictionary的[setObject:f

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