objectForKey和valueForKey之间的区别?

objectForKeyvalueForKey什么区别? 我在文档中查找了两个,他们对我来说也是一样的。

objectForKey:是一个NSDictionary方法。 NSDictionary是一个类似于NSArray的集合类,除了使用索引之外,它使用键来区分项目。 密钥是您提供的任意字符串。 没有两个对象可以具有相同的键(就像NSArray没有两个对象可以具有相同的索引一样)。

valueForKey:是一个KVC方法。 它适用于任何类。 valueForKey:允许您使用字符串作为其名称访问属性。 所以举例来说,如果我有一个Account类与财产accountNumber ,我可以做到以下几点:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setAccountNumber:anAccountNUmber]; NSNumber *anotherAccountNumber = [newAccount accountNumber]; 

使用KVC,我可以动态访问属性:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setValue:anAccountNumber forKey:@"accountNumber"]; NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"]; 

这些是等同的陈述。

我知道你在想:哇,但是讽刺。 KVC看起来并不是那么有用。 事实上,它看起来“罗嗦”。 但是当你想在运行时改变一些东西的时候,你可以做很多很酷的东西,这在其他语言中是非常困难的(但是这不在你的问题的范围之内)。

如果您想了解更多关于KVC的信息,如果您是Google,尤其是Scott Stevenson的博客 ,那么有许多教程。 您也可以签出NSKeyValueCoding协议参考 。

希望有所帮助。

当你做valueForKey:你需要给它一个NSString,而objectForKey:可以把任何NSObject子类作为一个键。 这是因为对于键值编码,键总是字符串。

事实上,这个文档指出,即使你给了valueForKey:一个NSString,它也会调用objectForKey:除非字符串以@开始,在这种情况下,它会调用[super valueForKey:] ,这可能会调用valueForUndefinedKey:例外。

下面是使用objectForKey:的一个很好的理由objectForKey:尽可能代替valueForKey:valueForKey:使用未知的键会抛出NSUnknownKeyException说“这个类不是关键的键值编码”。

如上所述, objectForKey: datatype是:(id)aKeyvalueForKey: datatype是:(NSString *)key

例如:

  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil]; NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]); //This will work fine and prints ( 123 ) NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime. 

所以, valueForKey:将只接受一个字符串值,是一个KVC方法,而objectForKey:将接受任何类型的对象。

objectForKey的值将被相同类型的对象访问。