提问



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的信息,如果你特别在Scott Stevenson的博客上有很多教程。你也可以查看NSKeyValueCoding Protocol Reference。[33] [34]


希望有所帮助。

其它参考1


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


实际上,文档说明即使你给valueForKey:一个NSString,它也会调用objectForKey:,除非字符串以@开头,在这种情况下它会调用[super valueForKey:] ,可以调用valueForUndefinedKey:,这可能会引发异常。

其它参考2


这里尽可能使用objectForKey:而不是valueForKey: - valueForKey:使用未知密钥的一个很好的理由会抛出NSUnknownKeyException说这个类不符合关键值编码钥匙 。

其它参考3


如上所述,objectForKey:数据类型为:(id)aKey,而valueForKey:数据类型为:(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中的值将由同一种对象访问。