setObject:forKey:
和setObject:forKeyedSubscript:
的作用是相同的浊竟,這兩個(gè)方法實(shí)現(xiàn)了同樣的功能水由,都是是為了實(shí)現(xiàn)給dictionary添加鍵值對(duì)旦委。
1剿另、setObject:forKey:
方法聲明:
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
參數(shù)詳解:
- anObject
anObject
是你要存入dictionary中的值坏平,是aKey
對(duì)應(yīng)的值卑吭,該對(duì)象被dictionary強(qiáng)引用;
注意:anObject
的值不可以是nil,如果被置為nil,會(huì)引發(fā)NSInvalidArgumentException
的異常崩潰丙躏,如果你想傳入一個(gè)空值择示,可以使用NSNull
代替;
- aKey
akey
是anObject
對(duì)應(yīng)的key值彼哼,先檢測(cè)dictionary中是否存在key對(duì)應(yīng)的鍵值對(duì)对妄,如果dictionary中存在了該key,則直接替換原有的value,否則就插入一條新鍵值對(duì)
注意: 如果key為nil的話敢朱,會(huì)拋出NSInvalidArgumentException異常
代碼說(shuō)明:
-
anObject
為空剪菱,為dictionary插入空對(duì)象:
- 測(cè)試代碼:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
id objc = nil;
[dict setObject:objc forKey:@"objc"];
- 結(jié)果:Crash
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: objc)'
-
anObject
使用NSNull,為dictionary插入空對(duì)象:
- 測(cè)試代碼:
id objc = [NSNull null];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
- 結(jié)果:
{
objc = "<null>";
}
-
aKey
為空:
- 測(cè)試代碼:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
id objc = @"AAAA";
[dict setObject:objc forKey:nill];
- 結(jié)果:Crash
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: key cannot be nil'
2拴签、setObject:forKeyedSubscript:
在iOS6.0之后孝常,Apple引入了一套非正式協(xié)議與Objective-C語(yǔ)法直接綁定。當(dāng)你實(shí)現(xiàn)了這其中的方法之后即可使用數(shù)組下標(biāo)來(lái)訪問(wèn)屬性元素蚓哩。如數(shù)組使用@[ ]
字典使用@{ }
初始化构灸、賦值、取值岸梨。
方法聲明:
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key
參數(shù)詳解:
- obj
anObject
是你要存入dictionary中的值喜颁,是aKey
對(duì)應(yīng)的值,該對(duì)象被dictionary強(qiáng)引用;
注意:如果obj
為空nil
,dictonary會(huì)將key
對(duì)應(yīng)的obj
移除曹阔;
- key
akey
是anObject
對(duì)應(yīng)的key值半开。
注意: 如果key為nil的話,會(huì)拋出NSInvalidArgumentException異常
代碼說(shuō)明:
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"]);
+打印結(jié)果:
dict:{
name = Tom;
}
age:23
name:Tom,sex:(null)
注意: 使用時(shí)可以無(wú)需調(diào)用setObject:forKeyedSubscript:
方法赃份,當(dāng)使用下標(biāo)賦值時(shí)寂拆,會(huì)調(diào)用該方法。
總結(jié):
- 當(dāng)調(diào)用
setObject:forKey:
value傳入nil
值時(shí)會(huì)導(dǎo)致崩潰抓韩; - 當(dāng)調(diào)用
setObject:forKeyedSubscript:
value傳入nil
值時(shí)不會(huì)崩潰纠永; - 當(dāng)調(diào)用
setObject:forKey:
需要傳入的value是nil
時(shí),可以使用NSNull谒拴; - 當(dāng)使用下標(biāo)賦值等效于調(diào)用setObject:forKeyedSubscript:方法尝江,可以賦空值;
- 無(wú)論
setObject:forKey:
還是setObject:forKeyedSubscript:
其key
不能為空英上,如果傳入空值都會(huì)崩潰茂装;