Установка NSDictionary объекта в качестве свойства в дочернем представлении либо утечка, когда не выпущен, либо дает ошибку EXC_BAD_ACCESS, когда освобождается - PullRequest
0 голосов
/ 24 августа 2011

У меня есть следующая проблема: В определенном контроллере представления у меня есть NSDictionary, который сам по себе является записью в объекте NSArray. Этот контроллер представления имеет дочернее представление, которое отображает некоторые пары ключ-значение, которые есть в этом словаре. Поскольку мне нужны только некоторые пары ключ-значение, я создаю новый объект словаря, из которого я затем удаляю пару ключ-значение, которую я не хочу иметь в ней. Чтобы иметь доступ к этому словарю в дочернем представлении, я мог бы просто установить словарь через свойство, которое, кажется, работает нормально. Для иллюстрации с некоторым кодом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // today is an instance of NSArray holding a number of NSDictionary objects
    NSDictionary *completeData = [self.today objectAtIndex:row];
    NSDictionary *data = [[NSDictionary alloc] initWithDictionary:completeData];
    [data removeObjectForKey:@"name"];

    SomeViewController *childController = [[SomeViewController alloc] init];
    childController.data = data;

    [self.navigationController pushViewController:childController animated:YES];
    [childController release];

    // This results in a EXC_BAD_ACCESS error when navigating back to the parent 
    // view and calling didSelectRowAtIndexPath a second time. When commenting this 
    // line out, the error dissapears, but now the object leaks
    [data release];
}

Проблема возникает, когда после возвращения к родительскому представлению я пытаюсь заменить объект NSArray (сегодня) обновленной версией самого себя, вызвав

- (void)refreshDataNotification:(NSNotification *)notification {
    if (notification) {
        self.today = [NSArray arrayWithArray:[[[MyAppDelegate getAppDelegate] todaySchedule]  
            objectForKey:@"data"]];
        [self.tableView reloadData];
    }
} 

Обратите внимание, что до тех пор, пока я не освобождаю 'data' в didSelectRowAtIndexPath, я не получаю никакой ошибки, но тогда объект протекает. Когда я выпускаю его, я получаю EXC_BAD_ACCESS при выполнении refreshDataNotification.

Если кто-то знает, что я могу делать неправильно, пожалуйста, поделитесь со мной.

1 Ответ

0 голосов
/ 24 августа 2011

Установите переменную окружения NSZombieEnabled на YES, чтобы получить более полезные сообщения об ошибках при высвобождении объектов.(Установите переменную среды, просмотрев подробности в разделе «Исполняемые файлы»)

Также было бы полезно узнать, как вы определили свои свойства.(например, что такое @property для data в SomeViewController?)

ps - я знаю, что вы не вставили фактический код, но data - ужасное имя экземпляра для NSDictionary.dict лучше - но что-то более наглядное облегчило бы понимание вашего кода.

...