NSMutableDictionary的[setObject:forKey:]和[setObject:forKeyedSubscript:]对比使用

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

1、setObject:forKey:
方法声明:

- (void)setObject:(ObjectType)anObject forKey:(KeyType )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 = “”;
}


  • 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 )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不能为空,如果传入空值都会崩溃;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛漫漫爬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值