Если у нас есть 10 элементов в массиве, то он выделит 10 ячеек для каждого indexPath.row
Это не так - обычно количество выделенных ячеек будет NumberOfVisibleRows + 2 (илианалогичное значение).
Вот так (примерно) работает UITableView: как только определенная ячейка прокручивается из видимой области, она удаляется из иерархии представления UITableView (установите для свойства clipToBounds таблицы значение NO, и вы сможете это увидеть!) Ипомещается в какой-то внутренний кеш.dequeueReusableCellWithIdentifier:
метод проверяет, доступна ли ячейка для повторного использования в этом кэше, и возвращает ее (и возвращает ноль, если ячейка недоступна) - поэтому вам не нужно выделять ячейки больше, чем фактически соответствует видимой области.
dequeueReusableCellWithIdentifier
метод не зависит от текущего indexPath, скорее от идентификатора строки ячейки, который вы передаете ему.И indexPath используется только вами для получения соответствующего содержимого в ячейку.