我正试图从NSDictionary中获取价值,但遇到一个未定义键的异常。
NSDictionary *userNames=[[NSDictionary alloc] init];
NSString * testValue = @"";
testValue = [userNames valueForKey:@"@&"];//crashing here when key is @&
由于未捕获的异常“ NSUnknownKeyException”而终止应用程序, 原因:'[<__ NSDictionaryM 0x2831eeec0> valueForUndefinedKey:]
答案 0 :(得分:4)
从不不要使用valueForKey
从字典中获取单个值,除非您知道KVC是什么并且您确实需要KVC。
字典为空,键不存在,并且前导@
在KVC中具有特殊含义,因此valueForKey
在这种情况下会崩溃。
正确的API是objectForKey
,但如果密钥不存在,只需使用现代密钥下标至少获得nil
testValue = userNames[@"@&"];
答案 1 :(得分:1)
如果键不是以“ @”开头,则调用object(forKey :)。如果键确实以“ @”开头,则剥离“ @”并使用其余键调用[super valueForKey:]。
您可以
testValue = [userNames objectForKey:@"@&"]
或
testValue = [userNames valueForKey:@"&"]
答案 2 :(得分:0)
可能您不是在声明键和值。 NSDictionary要求您使用值和键进行初始化。 (无论是从文件中获取它们,还是在初始化时声明它们。
NSDictionary * userNames = [[NSDictionary alloc] initWithObjectsAndKeys:
@"value1", @"key1",
@"value2", @"key2",
nil];
NSString * testValue = [userNames valueForKey:@"key2"];
NSLog(@"%@", testValue);
还请注意,该值先写入,然后定义键。请参阅此document。
如果要先声明字典(就像您在问题中所做的那样),然后将值和键添加到字典中,则必须使用NSMutableDictionary。
NSMutableDictionary *userNames1 = [[NSMutableDictionary alloc] init];
[userNames1 setValue:@"firstValue" forKey:@"key1"];
[userNames1 setValue:@"secondValue" forKey:@"key2"];
NSLog(@"%@", [userNames1 valueForKey:@"key2"]);