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

Din*_*rne 3 cocoa objective-c 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]);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[<__ NSDictionaryI 0x618000268ac0> valueForUndefinedKey:]:此类不是密钥key1的密钥值编码兼容.

有人可以解释为什么我收到此错误,如果有任何解决方法?

Jos*_*ell 12

你不能@在键中使用valueForKey:.在这种情况下NSDictionary 有一些记录但可能是意外的行为:它剥离@[super valueForKey:]使用新密钥调用.这会查找对象上的键,而不是字典中的内容.实例上不存在这样的密钥NSDictionary,因此引发了异常.

您通常应该使用objectForKey:从中检索值NSDictionary.

信用证必须转到肯托马斯的下面的评论,纠正这个答案的早期版本.

  • Awww nut,+1给你,因为你的回答([这个问题在这个问题中进一步详述](http://stackoverflow.com/questions/17670240/nsdictionary-keys-with-symbol))比我的更正确. (2认同)
  • 这有点不正确.正如[记录](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/index.html#//apple_ref/occ/instm/NSDictionary/valueForKey :) `NSDictionary`类引用,如果你在一个以`@`开头的字典上调用`-valueForKey:`,它会删除`@`并调用`super`.实际上,它访问字典的属性,而不是键值映射.所以,`[dict valueForKey:@"@ allKeys"]`返回与`dict.allKeys`相同的内容. (2认同)