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不能为空,如果传入空值都会崩溃;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用中提到了在严格模式下使用map的function声明时,this指向undefined。这可能导致一些问题。解决方法是将map里面的function声明修改为箭头函数,因为箭头函数没有自己的this,它会继承父级作用域的this。这样就可以避免this指向undefined的问题。 引用中提到了setValue:ForKey:是KVC的主要方法,而setObject:ForKey:是NSMutableDictionary特有的方法。两者之间有一些区别。如果你是在使用NSMutableDictionary,应该使用setObject:ForKey:来设置对象的值。而如果你是在使用KVC,应该使用setValue:ForKey:来设置对象的值。 引用中提到了在GetNav方法中使用map遍历数组,并为每个元素动态生成一列数据,并为每一列数据添加了onClick事件。但在运行过程中报错说updateRoute为undefined。根据错误信息来看,可能是updateRoute这个方法未定义。需要检查代码中是否有定义这个方法,并且确保被正确引用。 综上所述,问题的解决方法包括: 1. 将map里面的function声明修改为箭头函数,以解决严格模式下this指向undefined的问题。 2. 根据具体情况选择使用setValue:ForKey:或setObject:ForKey:方法来设置对象的值。 3. 检查代码中是否正确定义了updateRoute方法,并确保正确引用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [TypeError:Cannot read properties of undefined(reading XXX)](https://blog.csdn.net/qq_57558631/article/details/124961465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [iOSsetValue和setObject的区别详解](https://download.csdn.net/download/weixin_38701407/12786722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蜗牛漫漫爬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值