iOS-NSDictionary的objectForKey和valueForKey

NSDictionary取值的時候有兩個方法,objectForKey:和valueForKey:

在這里我們來簡單研究一下它們的區別!

示例一:

NSDictionary*dict = [NSDictionarydictionaryWithObject:@"theValue"forKey:@"theKey"];

NSString*value1 = [dictobjectForKey:@"theKey"];

NSString*value2 = [dictvalueForKey:@"theKey"];

這時候獲取到的value1和value2是一樣的結果。


示例二:

NSDictionary*dict = [NSDictionarydictionaryWithObject:@"theValue"forKey:@"@theKey"];//注意此處key是以@開頭

NSString*value1 = [dictobjectForKey:@"@theKey"];

NSString*value2 = [dictvalueForKey:@"@theKey"];

這時候value1可以正確取值,但是value2取值會直接crash掉,報錯信息:

Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<__NSCFDictionary0x892fd80> valueForUndefinedKey:]: this class is not key value coding-compliantforthe key theKey.’

這是因為valueForKey:是KVC(NSKeyValueCoding)的方法,在KVC里可以通過property同名字符串來獲取對應的值。比如:

valueForKey:取值是找和指定key同名的property accessor,沒有的時候執行valueForUndefinedKey:,而valueForUndefinedKey:的默認實現是拋出NSUndefinedKeyException異常。

回過頭來看剛才crash的例子,[dict valueForKey:@"@theKey"];會把key里的@去掉,也就變成了[dict valueForKey:@"theKey"];,而dict不存在theKey這樣的property,轉而執行[dict valueForUndefinedKey:@"theKey"];,拋出NSUndefinedKeyException異常后crash掉。

總結:

objectForKey: 和 valueForKey: 在多數情況下都是一樣的結果返回,但是如果 key 是以 @ 開頭,valueForKey: 就成了一個大坑,建議在 NSDictionary 下只用 objectForKey: 來取值。

原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容