Быстрее ли создавать UITableViewCell программно или загружать один из наконечника?

Профилировщик времени показывает, что самая трудоемкая операция в моем приложении - загрузка UITableViewCells из файлов nib. Самый дорогой из них включает загрузку UITableViewCell с изображением 4 КБ.

Я загружаю UITableViewCell из nib следующим кодом:

    [[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

Кто-нибудь сравнивал разницу между созданием представления программным способом или загрузкой UITableViewCell из nib?

EDIT:
Я сравнил временной профиль повторных прогонов загрузки UITableViewCell с наконечника и программного создания представления. Мой тест включал чередование между двумя UITableViews примерно 10 раз в промежутке 3-5 секунд. В каждом тесте загрузка программного обеспечения UITableViewCell была значительно быстрее, между 2x и 6x быстрее.

Может ли кто-нибудь подтвердить эти результаты?

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

    if (self.UITableViewPortaitNib == nil) {
        self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]];
    }

    self.UITableViewPortaitNib instantiateWithOwner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

Я также использовал инструмент автоматизации для создания более последовательных прогонов, и результаты по-прежнему предполагают, что загрузка UITableViewCells программно быстрее, чем загрузка UITableViewCells для наконечника. Среднее время работы для загрузки UITableViewCells из ниба составляло около 90 мс, а среднее время работы для создания UITableViewCell программно составляло 50 мс.

Ответы

Ответ 1

Попробуйте создать объект UINib один раз, а затем отправьте его instantiateWithOwner:options: каждый раз, когда вам нужно создать новую ячейку. Из Ссылка на класс UINib:

Например, если в представлении таблицы используется файл nib для создания экземпляров ячеек таблицы, кеширование элемента в объекте UINib может обеспечить значительное улучшение производительности.

Ответ 2

В iOS 5 и упоминается в видеороликах WWDC 2011, существует более новый метод, который использует UINib. Вы регистрируете свой nib в методе viewDidLoad:, а затем упрощаете код в методе tableView:cellForRowAtIndexPath:. Это может ускорить процесс для вас (но я никогда не выполнял никаких сравнительных таймингов).

Пример: В вашем регистре viewDidLoad: напишите и сохраните ссылку на него:

NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];

В вашем методе tableView:cellForRowAtIndexPath: просто попросите ячейку (нет необходимости проверять нуль, поскольку она гарантированно вернет ячейку под iOS5) и настройте ячейку:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *myIdentifier = @"ReusableCustomCell";

    ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
    // Your configuration code goes here
    cell.nameLabel.text = @"some text";
    // ....

    return cell;
}

Код не проверен. Мне было бы интересно, если бы это было быстрее, чем с использованием только UINIB.

Ответ 3

Я загружаю ячейку nib (cellTemplate) один раз и дублирую ее по мере необходимости, поэтому в некотором смысле этот подход является программным и основанным на nib.

Дублирование было более сложным, чем я ожидал, поскольку mutableCopy не работал. Тем не менее, NSKeyedArchiver roundtrip:

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];

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

Но разве вы не должны измерять частоту кадров? В этом случае сложность UIView также входит в игру.