无法从NSDictionary访问密钥

时间:2011-10-10 09:39:18

标签: iphone key nsdictionary

我有以下代码:

- (id)initWithDictionaryRepresentation:(NSDictionary *)dictionary {
    self = [super init];
    if (self != nil) {
        dictionaryRepresentation = [dictionary retain];
        NSArray *allKeys = [dictionaryRepresentation allKeys];
        NSDictionary *k = [dictionaryRepresentation objectForKey:[allKeys objectAtIndex:[allKeys count] - 1]];
        NSArray *stepDics = [k objectForKey:@"Steps"];
        numerOfSteps = [stepDics count];
        steps = [[NSMutableArray alloc] initWithCapacity:numerOfSteps];
        for (NSDictionary *stepDic in stepDics) {
            [(NSMutableArray *)steps addObject:[UICGStep stepWithDictionaryRepresentation:stepDic]];
        }
          ............
}

我的应用程序在此行崩溃:

 NSArray *stepDics = [k objectForKey:@"Steps"];

但如果我试试这个也会崩溃:NSArray *stepDics = [k objectForKey:@"pr"];。似乎我无法访问任何密钥!

这就是我的字典的样子:    http://pastebin.com/w5HSLvvT

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

NSArray *allKeys = [dictionaryRepresentation allKeys];

将以不可预测的顺序返回密钥,因此您不应该使用

id key = [allKeys objectAtIndex:[allKeys count] - 1]

因为它可能每次都返回不同的内容,这在NSDictionary Documentation中的此函数的文档中显示。

  

未定义数组中元素的顺序

为什么不试试

NSDictionary* a = [dictionary objectForKey:@"A"];
NSArray* stepDics = [a objectForKey:@"Steps"];

答案 1 :(得分:0)

如果您要求输入不存在的密钥,字典将返回nil。它崩溃的事实意味着您有内存管理错误,而不是您在上面显示的代码中,而是在创建传递到initWithDictionaryRepresentation:方法的字典的代码中。你过度释放了存储在字典的@"Steps"键中的数组。