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