Ячейки UITableView высвобождаются, когда они не видны - PullRequest
7 голосов
/ 29 декабря 2011

У меня есть UITableView. каждая строка представляет собой тяжелый объект с видео, изображениями и т. д. Когда пользователь прокручивает это представление, как я могу освободить память невидимых строк и загрузить текущие видимые строки?

Ответы [ 4 ]

6 голосов
/ 29 декабря 2011

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

В вашем делегате табличного представления

 -(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView

говоритвы, когда прокрутка таблицы остановилась.

 [myTableView indexPathsForVisibleRows]

дает вам массив того, что видно.

Если ваша строка не находится в этом массиве, она не видна, и вы можете сделатьочистка вашего изображения / видео на нем.

2 голосов
/ 29 декабря 2011

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

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

Я думаю, что самый простой способ сделать это - просто переопределить -[UITableViewCell prepareForReuse]

Вызывается, когда ячейка возвращается в очередь повторного использования.Если пользователь быстро перемещается вверх и вниз по таблице, вам может не потребоваться очистить ячейку в тот момент, когда ячейка находится вне экрана (например, посмотрев на indexPathsForVisibleRows)

Но когда ячейка фактически помещается обратно в очередь повторного использования, это подходящее время для выполнения этой работы, поскольку вы знаете, что ячейка больше не появится на экране, пока вы не отключите ее и не настроите ее снова.

2 голосов
/ 29 декабря 2011

Перерабатываете ли вы UITableViewCells согласно рекомендациям Apple? Если нет, вы ДОЛЖНЫ прочитать документы Apple. Внутри cellForRowAtIndexPath: делегата у вас должно быть что-то [customCell setMediaObjects:]. Внутри вашего класса customCell вы можете освободить все предыдущие объекты mediaObject из памяти.

1 голос
/ 29 декабря 2011

Пристальный взгляд на ячейки табличного представления - Документация Apple

Когда вы вызываете dequeueReusableCellWithIdentifier, первые 10 (на экране могут отображаться только десять ячеек в один момент) будут созданы,тогда они будут просто загружены и настроены для показа.Итак, клетки не освобождаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...