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

原文链接

你可能感兴趣的:(iOS-NSDictionary的objectForKey和valueForKey)