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
akey
是anObject
对应的key值,先检测dictionary中是否存在key对应的键值对,如果dictionary中存在了该key,则直接替换原有的value,否则就插入一条新键值对
注意: 如果key为nil的话,会抛出NSInvalidArgumentException异常
代码说明:
anObject
为空,为dictionary插入空对象:
- 测试代码:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
id objc = nil;
[dict setObject:objc forKey:@"objc"];
- 结果:Crash
*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: objc)’
anObject
使用NSNull,为dictionary插入空对象:
- 测试代码:
id objc = [NSNull null];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
- 结果:
{
objc = “”;
}
aKey
为空:
- 测试代码:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
id objc = @"AAAA";
[dict setObject:objc forKey:nill];
- 结果: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
akey
是anObject
对应的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
不能为空,如果传入空值都会崩溃;