Мой 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]);
EXC_BAD_ACCESS означает, что ваша программа пытается получить доступ к адресу памяти, который недействителен или недоступен для вашего процесса по иным причинам. Чаще всего это происходит, когда вы пытаетесь отправить сообщение объекту, который уже был отключен. Итак, первый шаг в отладке EXC_BAD_ACCESS - выяснить, какой объект ваша программа пыталась отправить сообщение когда произошел сбой. Часто ответ неочевиден, и в этом случае NSZombieEnabled - отличный инструмент для определения того, какая строка кода вызвала сбой.
В вашем случае вы уже определили, что сбой происходит, когда вы вызываете [allXYZArray count]
, что делает allXYZArray
нашим главным подозреваемым. Этот объект возвращается из + [ToolBox getMergedSortedDictionaries: SecondDictionary:]
, так что вполне вероятно, что ваша ошибка заключается в реализации того, что встретилось ход. Я предполагаю, что он возвращает объект, который уже был выпущен, а не автоматически выпущен, как предписано в Руководстве по программированию управления памятью для Какао . (Между прочим, это один из самых важных документов в SDK. Я рекомендую перечитывать его раз в месяц, пока его политики и методы не станут для вас второй натурой.)
Хорошо, повторное использование ячейки не гарантирует, что ячейка будет инициализирована правильно: ячейка
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
иногда будет нулевой (особенно в первый раз, я думаю ).
Проверить ячейку на пустое значение и, если да, правильно ее инициализировать.
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];