не может получить доступ к ключу из NSDictionary - PullRequest
0 голосов
/ 10 октября 2011

У меня есть следующий код:

- (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"];

, но также падает, если я пытаюсь это сделать:не может получить доступ ни к одному из ключей!

Вот так выглядит мой словарь: http://pastebin.com/w5HSLvvT

Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 октября 2011

NSArray *allKeys = [dictionaryRepresentation allKeys];

Вернет вам ключи в непредсказуемом порядке, поэтому вам не следует использовать

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

, поскольку он может каждый раз возвращать что-то другое, это показанов документации для этой функции в Документация NSDictionary .

Порядок элементов в массиве не определен

Почему вы непопробуйте

NSDictionary* a = [dictionary objectForKey:@"A"];
NSArray* stepDics = [a objectForKey:@"Steps"];
0 голосов
/ 10 октября 2011

Словарь вернет nil, если вы попросите ключ, который не существует.Тот факт, что происходит сбой, означает, что у вас есть ошибка управления памятью, не в коде, который вы показываете выше, а в коде, который создает словарь, который передается в ваш метод initWithDictionaryRepresentation:.Вы перевыпускаете массив, который хранится в ключе @"Steps" словаря.

...