objectForKey
和之间有什么区别valueForKey
?我在文档中查看了它们,它们对我来说似乎是一样的.
objectForKey:
是一种NSDictionary
方法.An NSDictionary
是一个类似于a的集合类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协议参考.
希望有所帮助.
当你这样做时,valueForKey:
你需要给它一个NSString,而objectForKey:
可以将任何NSObject子类作为键.这是因为对于键值编码,键始终是字符串.
事实上,文档声明即使你给valueForKey:
NSString,它仍会调用objectForKey:
,除非字符串以a开头@
,在这种情况下它会调用[super valueForKey:]
,这可能调用valueForUndefinedKey:
可能引发异常.
这是一个很好的理由在objectForKey:
任何可能的地方使用而不是valueForKey:
- valueForKey:
用一个未知的密钥将抛出NSUnknownKeyException
"这个类不是密钥的密钥值编码兼容".
至于说,该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
将由同一种对象访问.