首先看一下setObject:forKey: 、 setValue:forKey: 、 setValue:forKeyPath: 的標(biāo)準(zhǔn)調(diào)用語(yǔ)句:
[muDict setValue:<#(nullableid)#> forKey:<#(nonnull NSString *)#>];
[muDict?setValue:<#(nullableid)#>?forKeyPath:<#(nonnull?NSString?*)#>];
[muDict?setObject:<#(nonnullid)#>?forKey:<#(nonnullid)#>];
明顯可以看出:
(1) setValue:forKey: 的value是可以為nil的(但是當(dāng)value為nil的時(shí)候,會(huì)自動(dòng)調(diào)用removeObject:forKey方法);
setObject:forKey: 的value則不可以為nil。
(2) setValue:forKey: 的key必須是不為nil的字符串類型;
setObject:forKey: 的key可以是不為nil的所有類型。
一般使用時(shí)需要注意,setValue:forKey 會(huì)調(diào)用 setObejct:forKey: ,但有一個(gè)例外就是當(dāng) setObejct:forKey: 的value為nil的時(shí)候,會(huì)去調(diào)用 removeObjectForKey: ,也就是說(shuō)會(huì)刪除該key對(duì)應(yīng)的value.
setObejct:forKey的key只要不是nil就行,存儲(chǔ)在dict里的只是對(duì)象的引用。
setValue:forKey的key必須是string,dict會(huì)復(fù)制整個(gè)value保存起來(lái)。
objectForKey: 和 valueForKey: 在多數(shù)情況下都是一樣的結(jié)果返回,但是如果 key 是以 @ 開頭,valueForKey: 就成了一個(gè)大坑,建議在 NSDictionary 下只用 objectForKey: 來(lái)取值。
setValue:forKey: 與 setValue:forKeyPath的區(qū)別
動(dòng)態(tài)設(shè)置: setValue:屬性值 forKey:屬性名(用于簡(jiǎn)單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用于復(fù)合路徑,例如Person有一個(gè)Account類型的屬性,那么person.account就是一個(gè)復(fù)合屬性)
動(dòng)態(tài)讀取: valueForKey:屬性名 、valueForKeyPath:屬性名(用于復(fù)合路徑)
以下是具體代碼實(shí)現(xiàn)與對(duì)比:
(1) setObject:和setValue:對(duì)比
NSMutableDictionary?*dict???=?[NSMutableDictionary?dictionaryWithDictionary:@{@"cs":@"test"}];
NSDictionary?*testDict??????=?@{@"name":@"test_name",@"age":@"12",@"dict":dict};
NSMutableDictionary?*muDict?=?[NSMutableDictionary?dictionaryWithDictionary:testDict];
[muDict?setObject:@"object"forKey:@"key"];
[muDict?setValue:@"value"forKey:@"key2"];
此時(shí)打印結(jié)果:
{
age?=12;
dict?=?????{
cs?=?test;
};
key?=object;
key2?=?value;
name?="test_name";
}
這里setObject:forKey:與setValue:forKey:的作用是相同的,先檢測(cè)muDict中是否存在key對(duì)應(yīng)的鍵值對(duì),存在就直接替換原有的value,否者就插入一條新鍵值對(duì)。
(2)forKeyPath:的使用
[muDict setValue:@"ceshi"forKeyPath:@"dict.cs"];
NSLog(@"%@",?muDict);
此時(shí)打印結(jié)果:
{
age?=12;
dict?=?????{
cs?=?ceshi;
};
key?=object;
key2?=?value;
name?="test_name";
}
這里是對(duì)muDict進(jìn)行操作,處理復(fù)合路徑dict.cs,首先檢測(cè)muDict中是否存在dict對(duì)應(yīng)的鍵值對(duì),存在就去檢測(cè)dict中是否有cs對(duì)應(yīng)的鍵值對(duì),有則替換value,沒有創(chuàng)建鍵值對(duì),如果muDict中檢測(cè)不到dict的存在,那么就停止操作。