Ошибка «EXC_BAD_ACCESS», когда ячейка начинает прокручиваться обратно в поле зрения? - PullRequest
0 голосов
/ 19 июля 2009

У меня есть некоторый (я думаю) довольно простой код для создания содержимого ячейки из источника данных, и все отлично работает, когда загружается дисплей. Однако, когда я начинаю прокручивать, чтобы просмотреть другой текст (вверх или вниз), код завершается неудачно с «GDB: Программа получила сигнал:« EXEC_BAD_ACCESS »». Вот код, который заполняет дисплей для различных разделов; каждый раздел имеет похожий код:

id cell = (UITableViewCell *)[tableView
    dequeueReusableCellWithIdentifier:CellIdentifier
];

titledCell = [[[TitledCell alloc]
          initWithFrame:CGRectZero
        reuseIdentifier:CellIdentifier
    ] autorelease
];

switch (tableSection) {
    case TABLE_SECTION_1:
        if (cell == nil) {
            dataKey = @"a key from data source";
            dataFromSource = [viewData objectForKey:dataKey];

            titledCell.title.text = dataKey;
            titledCell.contents.text = dataFromSource;
            cell = titledCell;
            break;
        }
    case TABLE_SECTION_2:        
    ...
}
return cell;

Когда я следовал за кодом, я заметил, что код пропускает создание ячейки при прокрутке ячейки обратно в поле зрения, потому что ячейка! = Ноль. Если он пропускается, это означает, что ячейка содержит то же содержимое, что и при первом создании, верно? Почему доставляет мне неприятности?

Ответы [ 4 ]

1 голос
/ 19 июля 2009

Не могу быть уверен на 100% в приведенном вами примере кода, но можно предположить, что оператор break находится внутри блока if. Так должно выглядеть:

switch( tableSection ) {
    case TABLE_SECTION_1:
            if( cell == nil ) {
                    dataKey = @"a key from data source";
                    dataFromSource = [ viewData objectForKey:dataKey ];

                    titledCell.title.text = dataKey;
                    titledCell.contents.text = dataFromSource;
                    cell = titledCell;
            }
            break;
    case TABLE_SECTION_2:        
    ...
}
1 голос
/ 19 июля 2009

Я обычно получаю EXEC_BAD_ACCESS, когда забываю что-то сохранить. Если у вас есть автоматически перемещаемый объект, он может работать в первый раз, но не работать во второй раз.

Запустите программу с отладкой и используйте XCode, чтобы выяснить, на какой линии происходит сбой. Это будет более полезным, чем что-либо еще.

1 голос
/ 19 июля 2009

Я думаю, что EXEC_BAD_ACCESS может быть вызвано:

titledCell.title.text = dataKey;

titledCell может быть освобожден, и при доступе к свойству будет исключение EXEC_BAD_ACCESS.

Вы можете включить окружение NSZombieEnabled в: Группа и файлы -> Расширяемые -> Ваше приложение -> Получить информацию -> Аргументы

0 голосов
/ 22 июля 2009

К сожалению, изменения сделали этот вопрос академическим, поэтому я не могу точно сказать, верны ли какие-либо из приведенных ответов. Текущий код выглядит немного ближе к этому:

 id cell = (UITableViewCell *)[tableView
      dequeueReusableCellWithIdentifier:CellIdentifier
 ];

 if (cell == nil) {
      titledCell = [[[TitledCell alloc]
                   initWithFrame:CGRectZero
                 reuseIdentifier:CellIdentifier
           ] autorelease
      ];

      switch (tableSection) {
           case TABLE_SECTION_1:
                dataKey = @"a key from data source";
                dataFromSource = [viewData objectForKey:dataKey];

                titledCell.title.text = dataKey;
                titledCell.contents.text = dataFromSource;
                cell = titledCell;
                break;
           case TABLE_SECTION_2:
           ...
 }
 return cell;

... так что большая часть кода теперь находится в блоке if (cell == nil) (что более логично) и работает нормально. Хотелось бы, чтобы я понял, что случилось, но все равно спасибо за ваши ответы!

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