当我在密钥中使用RestKit
符号进行JSON响应时,@
遇到问题。经过一些调试后,似乎问题出现在__NSCFDictionary
所以我尝试了以下简单的代码:
NSArray *keys = [NSArray arrayWithObjects:@"@key1", @"@key2", nil];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects
forKeys:keys];
for (id key in dictionary) {
NSLog(@"key: %@, value: %@", key, [dictionary valueForKey:key]);
}
我收到以下错误:
[< __ NSDictionaryI 0x618000268ac0> valueForUndefinedKey:]:这个类 密钥key1不符合密钥值编码。
有人可以解释一下我收到此错误的原因以及是否有任何解决方法?
答案 0 :(得分:12)
您无法将@
与valueForKey:
结合使用。在这种情况下NSDictionary
has some documented but perhaps unexpected behavior:它会剥离@
并使用新密钥调用[super valueForKey:]
。这将查找对象上的键,而不是字典的内容。 <{1}}的实例上不存在这样的密钥,因此会引发异常。
您通常应使用NSDictionary
从objectForKey:
检索值。
下面的评论必须归功于Ken Thomases,纠正这个答案的早期版本。
答案 1 :(得分:0)
因为你复制了使用valueForKey:而不是objectForKey的人的代码:不了解每个人的好处。
objectForKey:是你应该使用的。它会传入您传入的密钥,并查找该密钥的值。
valueForKey:是一种高度复杂的方法,它查看键中的文本,并执行所有类型的复杂操作,例如@“@ sum”的键将添加一些值。如果这就是你想要的,那很好。如果要查找值,请使用objectForKey。它做你认为它应该做的事情,并且通常比valueForKey快几倍:无论如何。
根据经验:如果我问你是否应该使用objectForKey:或valueForKey:,而你不知道区别是什么,请使用objectForKey: