EXEC_BAD_ACCESS в UITableView cellForRowAtIndexPath - PullRequest
5 голосов
/ 29 апреля 2010

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

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

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

Затем прокрутка табличного представления к нижней части и резервное копирование приводит к сбою, так как происходит перезагрузка метода 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]);

Ответы [ 2 ]

10 голосов
/ 30 апреля 2010

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

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

1 голос
/ 29 апреля 2010

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

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

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

if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
...