2011-12-29 4 views
7

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

+1

использовать повторно используемые ячейки и забыть о работе с памятью (оставьте ее в системе) – samfisher

ответ

6

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

В вашем Tableview делегат

-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView 

говорит вам, когда TableView скроллинг остановился.

[myTableView indexPathsForVisibleRows] 

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

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

2

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

1

A Closer Look at Table-View Cells - Apple Documentation

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

2

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

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

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

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

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

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