EXEC_BAD_ACCESS в UITableView cellForRowAtIndexPath

Мой UITableView возвращается EXEC_BAD_ACCESS, но почему!

Посмотрите этот фрагмент кода!

Загрузка UITableView хорошо работает, таким образом, allXYZArray != nil и заполняется!

Затем прокрутка tableview к нижней части и создает резервную копию, заставляет это отказывать, когда это идет для перезагрузки метода cellForRowAtIndexPath

Это перестало работать на строке:

    "NSLog(@"allXYZArray::count: %i", [allXYZArray count]);"

        (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
@try
{ 
if (allXYZArray == nil) {
   NSLog(@"nil");
   allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought];
}
NSLog(@"%i", [indexPath row]);
NSLog(@"allXYZArray::count: %i", [allXYZArray count]);
5
задан codercat 3 January 2014 в 13:21
поделиться

2 ответа

EXC_BAD_ACCESS означает, что ваша программа пытается получить доступ к адресу памяти, который недействителен или недоступен для вашего процесса по иным причинам. Чаще всего это происходит, когда вы пытаетесь отправить сообщение объекту, который уже был отключен. Итак, первый шаг в отладке EXC_BAD_ACCESS - выяснить, какой объект ваша программа пыталась отправить сообщение когда произошел сбой. Часто ответ неочевиден, и в этом случае NSZombieEnabled - отличный инструмент для определения того, какая строка кода вызвала сбой.

В вашем случае вы уже определили, что сбой происходит, когда вы вызываете [allXYZArray count] , что делает allXYZArray нашим главным подозреваемым. Этот объект возвращается из + [ToolBox getMergedSortedDictionaries: SecondDictionary:] , так что вполне вероятно, что ваша ошибка заключается в реализации того, что встретилось ход. Я предполагаю, что он возвращает объект, который уже был выпущен, а не автоматически выпущен, как предписано в Руководстве по программированию управления памятью для Какао . (Между прочим, это один из самых важных документов в SDK. Я рекомендую перечитывать его раз в месяц, пока его политики и методы не станут для вас второй натурой.)

10
ответ дан 13 December 2019 в 19:23
поделиться

Хорошо, повторное использование ячейки не гарантирует, что ячейка будет инициализирована правильно: ячейка

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];

иногда будет нулевой (особенно в первый раз, я думаю ).

Проверить ячейку на пустое значение и, если да, правильно ее инициализировать.

if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
1
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: