objectForKey返回指定key的value,若没有这个key返回nil
valueForKey同样是返回指定key的value
一般来说key可以是任意字符串组合,如果key不是以@符号开头,这时候valueForKey:等同于objectForKey:,如果以@开头,去掉key里的@然后用剩下部分作为key执行[super valueForKey:]。
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theValue" forKey:@"theKey"];
NSString *value1 = [dict objectForKey:@"theKey"];
NSString *value2 = [dict valueForKey:@"theKey"];
这个时候value1和value2是一样的结果。如果这样一个dict:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theValue" forKey:@"@theKey"];
NSString *value1 = [dict objectForKey:@"@theKey"];
NSString *value2 = [dict valueForKey:@"@theKey"];
value1可以正确取值,但是value2取值会直接crash掉,报错信息:NSUnknownKeyException
这是因为valueForKey:是KVC(NSKeyValueCoding)的方法,在KVC里可以通过property同名字符串来获取对应的值。
valueForKey:取值是找和指定key同名的property accessor,没有的时候执行valueForUndefineKey:,而valueForUndefineKey:的默认实现是抛出NSUndefineKeyException异常。
objectForKey:和valueForkey:在多数情况下都是一样的结果返回,但是如果key是以@开头,valueForKey:就成了一个大坑,建议在NSDictionary下只用objectForKey:来取值。