关于objective c:objectForKey和valueForKey之间的区别?

Difference between objectForKey and valueForKey?

objectForKeyvalueForKey有什么区别?我在文档中查阅了这两个文档,我觉得它们是一样的。


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

valueForKey:是一种kvc方法。它适用于任何班级。valueForKey:允许您使用名称字符串访问属性。因此,例如,如果我有一个Account类和一个accountNumber类的属性,我可以执行以下操作:

1
2
3
4
5
6
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setAccountNumber:anAccountNUmber];

NSNumber *anotherAccountNumber = [newAccount accountNumber];

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

1
2
3
4
5
6
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setValue:anAccountNumber forKey:@"accountNumber"];

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];

这些是等价的语句集。

我知道你在想:哇,但讽刺地说。kvc看起来并不那么有用。事实上,它看起来"冗长"。但是当你想在运行时改变一些事情时,你可以做很多在其他语言中更困难的酷的事情(但这超出了你的问题范围)。

如果你想了解更多关于kvc的知识,有很多教程,尤其是在ScottStevenson的博客上。您还可以查看nskeyValueCoding协议参考。

希望有帮助。


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

事实上,文档规定,即使您给valueForKey:一个nsstring,它也会无论如何调用objectForKey:,除非字符串以@开头,在这种情况下,它调用[super valueForKey:],这可能会调用valueForUndefinedKey:,这可能会引发异常。


这里有一个很好的理由尽可能使用objectForKey:,而不使用带有未知密钥的valueForKey:-valueForKey:,会抛出NSUnknownKeyException,说"这个类不是密钥的键值编码兼容"。


如前所述,objectForKey:数据类型为:(id)aKey,而valueForKey:数据类型为:(NSString *)key

例如:

1
2
3
4
5
6
7
 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中的值将由同一类对象访问。