看了看 objectForkey和valueForkey的區別
同樣是取值
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:@"AA" forKey:@"MM"];
NSLog(@"aaa = %@",[dict objectForKey:@"MM"]);
NSLog(@"bbb = %@",[dict valueForKey:@"MM"]);
這樣是都可以正常打印出來想要的字符串『AA』
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:@"AA" forKey:@"@MM"];
NSLog(@"aaa = %@",[dict objectForKey:@"@MM"]);
NSLog(@"bbb = %@",[dict valueForKey:@"@MM"]);
這個時候就不會像上一個一樣的。程序會報錯
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: 來取值。