2015-12-03 2 views
8

Мне интересно, если я каким-то образом наткнулся на ошибку, где проведите удалять, чтобы удалить UITableViewCells, никогда не освобождайте, когда делают их UITableViewController.deleteRowsAtIndexPaths: проведите по удалению строк, никогда не освобождая ячейку?

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

Если я проведу, чтобы удалить один (или более), и нажмите назад, регистрируется только 5. Поэтому я оставляю адрес указателя ячейки, которая была удалена, для дальнейшего использования. Теперь, когда я иду назад и приостановить выполнение в любой момент я могу войти в lldb строку:

po 140382950334240 
<TableLeakCell: 0x7fe67852a490; baseClass = UITableViewCell; frame = (-375 176; 375 44); text = 'Chris'; hidden = YES; autoresize = W; gestureRecognizers = <NSArray: 0x7fe678530d70>; layer = <CALayer: 0x7fe67852a860>> 

Это должно быть высвобождено! x.position ячейки - это точно -(tableView.width) и hidden=YES. Как и в ячейке, все еще находится в позиции после завершения анимации. Или, возможно, его ставят в очередь за повторное использование? В любом случае, он существует навсегда, и в документации Apple нет ничего о необходимости вручную уничтожить ячейку после вызова deleteRowsAtIndexPaths.

Краткое доказательство концепции проекта здесь: https://github.com/iOSDigital/UITableViewLeak

+0

Nice demo. Создайте отчет об ошибке с Apple! – matt

ответ

0

По крайней мере, с помощью Xcode 7.2/iOS 9.2 Simulator и Xcode 7.3/iOS 9.3 Device все клетки получают перераспределена. Только изменение - это порядок освобождения, удаленная ячейка get dealloc'd last.

Смежные вопросы