UITableView dequeueReusableCellWithIdentifier Theory

Когда Apple разработала UITableView для первого iPhone, у них возникли проблемы с производительностью при прокрутке. Затем один умный инженер обнаружил, что причиной этого было то, что распределение объектов связано с ценой, поэтому он придумал способ повторного использования ячеек.

«Распределение объектов сопряжено с расходами на производительность, особенно если распределение должно происходить неоднократно в течение короткого периода, скажем, когда пользователь прокручивает табличное представление. Если вы используете ячейки вместо того, чтобы выделить Когда ячейка исчезнет с экрана, она будет помещена в очередь повторного использования TableView. Когда требуется новая ячейка, она ищет в очереди, доступна ли ячейка с тем же идентификатором, и вызывает метод prepareForReuse для этой ячейки и удаляет себя из очереди.

33
задан Bartosz Ciechanowski 20 October 2013 в 11:45
поделиться

2 ответа

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



UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (nil == cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];
}

// Do something to cell

return cell;

. Фактически, будет выделено достаточно строк, чтобы заполнить видимую часть tableview (плюс один или два более). Когда ячейки прокручиваются за пределами экрана, они удаляются из таблицы и помечаются как готовые для повторного использования . По мере роста очереди «доступных ячеек» ваша строка, которая запрашивает исключенную из очереди ячейку , начнет получать ячейку для использования, после чего вам больше не придется выделять память.

43
ответ дан 27 November 2019 в 18:16
поделиться

Код для deqeueueReusableCellsWithIdentifier: будет выглядеть примерно так:

(Взято из одного из моих собственных проектов, где я делаю нечто подобное с представлениями/страницами в постраничном прокручиваемом представлении)

- (UIView*) dequeueReusablePage
{
    UIView* page = [reusablePages_ anyObject];
    if (page != nil) {
        [[page retain] autorelease];
        [reusablePages_ removeObject: page];
    }
    return page;
}

Итак, он сохраняет простой NSMutableSet с многократно используемыми объектами.

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

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

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

13
ответ дан 27 November 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: