objectForKey和valueForKey之间的区别?
objectForKey
和valueForKey
什么区别? 我在文档中查找了两个,他们对我来说也是一样的。
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)aKey
而valueForKey:
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
的值将被相同类型的对象访问。