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: 來取值。