Какой жизненный цикл у ячейки в списке в iOS?
Что проверяют
Понимаете ли вы механизм переиспользования ячеек и что из него следует для кода: где создавать сабвью, где заполнять данными, где сбрасывать состояние. Следом обычно дают задачу про картинку, которая загрузилась асинхронно и появилась не в той ячейке.
Как отвечать
Опишите путь ячейки на примере UITableView, у UICollectionView он такой же:
- регистрация: класс или nib под идентификатором через
register(_:forCellReuseIdentifier:); - получение: в
tableView(_:cellForRowAt:)вызываетсяdequeueReusableCell(withIdentifier:for:). Есть свободная ячейка в пуле, таблица отдаёт её, нет, создаёт новую черезinit(style:reuseIdentifier:)или из nib с вызовомawakeFromNib(). Этот метод всегда возвращает ячейку, а не опционал; - сброс: перед выдачей переиспользуемой ячейки таблица вызывает у неё
prepareForReuse(); - настройка: в
cellForRowAtвы заполняете ячейку данными строки; - показ: делегат получает
tableView(_:willDisplay:forRowAt:), ячейка раскладывается вlayoutSubviews(); - уход с экрана: приходит
tableView(_:didEndDisplaying:forRowAt:), ячейка возвращается в пул и ждёт следующего запроса, а не уничтожается.
Добавьте современный вариант: UICollectionView.CellRegistration, dequeueConfiguredReusableCell(using:for:item:), UICollectionViewDiffableDataSource и UIContentConfiguration. Регистрация и настройка собраны в одном месте, строковые идентификаторы не нужны. Для предзагрузки данных есть UITableViewDataSourcePrefetching.
Где спотыкаются
Думают, что ячейка создаётся на каждую строку. Их примерно столько, сколько помещается на экране, плюс небольшой запас, поэтому любое состояние, не сброшенное явно, переедет к другой строке.
Сбрасывают контент в prepareForReuse() и считают, что этого достаточно. Apple советует сбрасывать там только внешние атрибуты вроде выделения и прозрачности, а данные всегда задавать заново в cellForRowAt.
Ставят картинку без проверки: к моменту ответа сети ячейка уже показывает другую строку. Нужно отменять загрузку в prepareForReuse() или сверять идентификатор модели перед установкой изображения.