从NSDictionary获取值时出错

时间:2019-02-28 05:34:03

标签: ios objective-c

我正试图从NSDictionary中获取价值,但遇到一个未定义键的异常。

NSDictionary *userNames=[[NSDictionary alloc] init]; 
NSString * testValue = @"";
testValue = [userNames valueForKey:@"@&"];//crashing here when key is @&
  

由于未捕获的异常“ NSUnknownKeyException”而终止应用程序,   原因:'[<__ NSDictionaryM 0x2831eeec0> valueForUndefinedKey:]

3 个答案:

答案 0 :(得分:4)

从不不要使用valueForKey从字典中获取单个值,除非您知道KVC是什么并且您确实需要KVC。

字典为空,键不存在,并且前导@在KVC中具有特殊含义,因此valueForKey在这种情况下会崩溃。

正确的API是objectForKey,但如果密钥不存在,只需使用现代密钥下标至少获得nil

testValue = userNames[@"@&"];

答案 1 :(得分:1)

Apple doc

  

如果键不是以“ @”开头,则调用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"]);