当我们的密钥中有@符号时,为什么NSDictionary会吓坏我?

时间:2014-03-02 07:18:13

标签: objective-c cocoa nsdictionary key-value-coding

当我在密钥中使用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不符合密钥值编码。

有人可以解释一下我收到此错误的原因以及是否有任何解决方法?

2 个答案:

答案 0 :(得分:12)

您无法将@valueForKey:结合使用。在这种情况下NSDictionary has some documented but perhaps unexpected behavior:它会剥离@并使用新密钥调用[super valueForKey:]。这将查找对象上的键,而不是字典的内容。 <{1}}的实例上不存在这样的密钥,因此会引发异常。

您通常应使用NSDictionaryobjectForKey:检索值。

下面的评论必须归功于Ken Thomases,纠正这个答案的早期版本。

答案 1 :(得分:0)

因为你复制了使用valueForKey:而不是objectForKey的人的代码:不了解每个人的好处。

objectForKey:是你应该使用的。它会传入您传入的密钥,并查找该密钥的值。

valueForKey:是一种高度复杂的方法,它查看键中的文本,并执行所有类型的复杂操作,例如@“@ sum”的键将添加一些值。如果这就是你想要的,那很好。如果要查找值,请使用objectForKey。它做你认为它应该做的事情,并且通常比valueForKey快几倍:无论如何。

根据经验:如果我问你是否应该使用objectForKey:或valueForKey:,而你不知道区别是什么,请使用objectForKey: