Когда Apple разработала UITableView
для первого iPhone, у них возникли проблемы с производительностью при прокрутке. Затем один умный инженер обнаружил, что причиной этого было то, что распределение объектов связано с ценой, поэтому он придумал способ повторного использования ячеек.
«Распределение объектов сопряжено с расходами на производительность, особенно если распределение должно происходить неоднократно в течение короткого периода, скажем, когда пользователь прокручивает табличное представление. Если вы используете ячейки вместо того, чтобы выделить Когда ячейка исчезнет с экрана, она будет помещена в очередь повторного использования TableView. Когда требуется новая ячейка, она ищет в очереди, доступна ли ячейка с тем же идентификатором, и вызывает метод
prepareForReuse
для этой ячейки и удаляет себя из очереди.
dequeueReusableCellWithIdentifier:
возвращает только ячейку
, если она была помечена как готовая к повторному использованию. Вот почему почти в каждом методе cellForRowAtIndexPath:
вы увидите что-то вроде
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
// Do something to cell
return cell;
. Фактически, будет выделено достаточно строк, чтобы заполнить видимую часть tableview
(плюс один или два более). Когда ячейки прокручиваются
за пределами экрана, они удаляются из таблицы
и помечаются как готовые для повторного использования
. По мере роста очереди «доступных ячеек» ваша строка, которая запрашивает исключенную из очереди ячейку
, начнет получать ячейку
для использования, после чего вам больше не придется выделять память.
Код для deqeueueReusableCellsWithIdentifier:
будет выглядеть примерно так:
(Взято из одного из моих собственных проектов, где я делаю нечто подобное с представлениями/страницами в постраничном прокручиваемом представлении)
- (UIView*) dequeueReusablePage
{
UIView* page = [reusablePages_ anyObject];
if (page != nil) {
[[page retain] autorelease];
[reusablePages_ removeObject: page];
}
return page;
}
Итак, он сохраняет простой NSMutableSet
с многократно используемыми объектами.
Когда ячейки прокручиваются с экрана и больше не видны, они помещаются в этот набор.
Таким образом, вы начинаете с пустого набора, и набор будет расти, только если у вас есть больше данных для отображения, чем видно на экране.
Использованная ячейка прокручивается с верхней части экрана, помещается в набор, затем принимается за ячейку, которая появляется в нижней части экрана.