EXC_BAD_ACCESS NSМассив ManagedObjects (базовые данные) - PullRequest
1 голос
/ 21 июня 2010

Что-то странное происходит с моим приложением для iphone. Я использую Core Data для хранения данных в базе данных SQLite. В первый раз после запуска моего приложения я пытаюсь прочитать таблицу, чтобы вернуть все строки, чтобы заполнить UITableView списком вещей, из которых пользователь может выбирать. Если они выбрали верхний элемент в списке, я получаю исключение EXC_BAD_ACCESS. Если они выбирают какой-либо другой элемент, все кажется в порядке. Вот пример кода: Спорт и Команда являются NSManagedObjects. sports - это NSArray of Sport объектов, выбранных с помощью NSFetchedResultsController (fetchedObjects). Я могу отображать список объектов нормально в UITableView (я использую тот же массив для вызова cellForRowAtIndexPath () без каких-либо проблем

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    Sport *sport = (Sport *)[sports objectAtIndex:indexPath.row];

    if (teamSetup) {
        if (team.sport != sport) {
            [team setSport:sport]; <-- this is where the EXC_BAD_ACCESS happens

            NSError *error;
            [team.managedObjectContext save:&error];
        }
        [self.navigationController popViewControllerAnimated:YES];

    } else {
        // .. do some other stuff

    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

ОБНОВЛЕНИЕ: Кажется, что оно влияет только на последнюю запись в NSArray вместо первой, пока не возникнет ошибка EXC_BAD_ACCESS. После перезапуска приложения проблема исчезает, и код работает, как и ожидалось: (

1 Ответ

0 голосов
/ 09 ноября 2011

Нет ничего плохого в строке выше, где встречается EXC_BAD_ACCESS. Тем не менее, он может дать подсказку, что существует проблема с объектами team или sport. Первый путь, который следует использовать, - это то, что один из этих объектов был освобожден, потому что он не был сохранен в достаточной степени.

Освобожденные объекты не могут быть немедленно освобождены. Вот почему EXC_BAD_ACCESS может произойти в странное время. Объекты освобождаются только тогда, когда часть памяти, которую они использовали, больше не нужна. Другие объекты, конечно, будут использовать тот же кусок. Поэтому, когда этот кусок становится подходящим для освобождения, вы как разработчик не можете его контролировать. Это обрабатывается средой выполнения.

Лучше всего сначала запустить Анализатор, затем запустить Инструменты, профилируя с помощью инструмента Утечки.

Есть отличное объяснение всего этого, и пошаговый совет по отслеживанию EXC_BAD_ACCESS ошибок на сайте Лу Франко:

Понимание EXC_BAD_ACCESS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...