setObject:forKey,setValue:forKey,setValue:forKeyPath的區(qū)別和用法

首先看一下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的存在,那么就停止操作。

文章參考:setObject:forKey:與setValue:forKey:的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容