NSMutableDictionary的[setObject:f

2019-11-04  本文已影响0人  喔牛慢慢爬

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

1、setObject:forKey:

方法声明:

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

参数详解:

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

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

代码说明:
  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)'


  1. 测试代码:
id objc = [NSNull null];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  1. 结果:

{
objc = "<null>";
}


  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

参数详解:

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

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:方法,当使用下标赋值时,会调用该方法。

总结:
上一篇下一篇

猜你喜欢

热点阅读