Подкласс UITableViewCell создает зомби, если не сохраняется - PullRequest
0 голосов
/ 29 апреля 2011

Я создал подкласс UITAbleViewCell с пользовательским пером и использую его в двух разных UITableViews в своем приложении. Он отлично работает в одной из таблиц, но при интенсивной прокрутке происходит сбой другой таблицы. Instruments идентифицирует зомби в этом коде (в cellForRowAtIndexPath):

NSString *identifier = @"edit";
LogTableCell *cell = (LogTableCell*)[tableView dequeueReusableCellWithIdentifier:identifier];

if (!cell) {
   cell = (LogTableCell*) [[[NSBundle mainBundle] loadNibNamed:@"LogTableCell" owner:self options:nil] objectAtIndex:0];        
   [cell retain];       // prevents zombies!
}
NSLog(@"%@: retainCount: %d", identifier, [cell retainCount]);

// some other cell init stuff

return cell;

Обратите внимание на [сохранение ячейки]; строка - когда он там, код работает плавно. Выньте это и разбейте. NSLog всегда сообщает retainCount 2, так что в этом нет необходимости. Но если я сделаю что-то вроде этого:

   if ([cell retainCount] < 1) { [cell retain]; }       // does not prevent zombies!

это не работает. Нет ассигнования / инициализации, поэтому мне не нужно было делать авто-релиз или беспокоиться об этом вообще, и я всегда думал, что cellForRowAtIndexPath освобождает ячейку для меня.

Когда я не использую инструменты, вот ошибка, которую я получаю из xcode:

*** -[CALayer retain]: message sent to deallocated instance 0x4d8e930

Даже если он работает с [удержанием ячейки]; линия, это выглядит как утечка для анализа (и для меня), поэтому я хотел бы решить эту проблему. Кто-нибудь знает, что здесь происходит?

1 Ответ

2 голосов
/ 29 апреля 2011

Не вызывайте retainCount

Абсолютный счет удержания бесполезен.

([cell retainCount] < 1) не может работать;retainCount никогда не сможет вернуть ноль.

(Да, загрузка пера в cellForRowAtIndexPath: теперь благословлена ​​платформой. Coolio.)

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

Вполне вероятно, что произойдет утечка пула с авто-выпуском, которая происходит до истечения обычного цикла обработки событий.В частности, что-то где-то имеет слабую ссылку на ячейку, которая не должна.

Если вы запустите инструмент Allocations и включите сохранение / разблокировку записи событий, вы сможете точно увидеть, где находятся вызовы, чтобы сохранить / освободить/ autorelease объект происходит.Событие, вызывающее сбой, имеет очевидное значение.

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

...