Если количество строк
- исправлено
- количество строк очень мало (объем памяти)
и каждый ряд довольно не связан, Quick Way ™ должен был бы предварительно инициализировать все ячейки и возвращать их по мере необходимости:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [myCells objectAtIndex:indexPath.row];
}
Однако, если есть небольшая вероятность того, что все ваши ячейки не поместятся в память сразу (запомните все фоновые вещи, которые также увеличивают ваше общее доступное пространство кучи в 22-25 МБ), вам все равно следует подумать о том, чтобы Более подробный способ и лениво создавать ячейки при первом обращении к ним, а затем кешировать результат. Хорошей новостью является то, что UITableView уже делает именно это для вас, просто используйте идентификаторы ячеек, как и предполагалось.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *identifier = [NSString stringWithFormat:@"MyCell%d", indexPath.row];
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[MyTableViewCell alloc] initWithCellIdentifier:identifier];
[cell autorelease]; // if non-ARC
}
return cell;
}
Я не рекомендую использовать нулевой идентификатор, как предлагает rocir. Предоставляя идентификатор ячейки nil, вы не позволяете UTTableViewController кэшировать ячейку для вас ( документация ). Это создает дополнительные издержки, когда ваша ячейка прокручивается из видимой области и снова становится видимой на более позднем этапе, когда пользователь прокручивает назад. В этом случае ячейка все еще может быть рядом, но у вас нет возможности получить к ней доступ при вызове tableView: cellForRowAtIndexPath:.