При правильном использовании UITableView выделяется только столько экземпляров UITableViewCell, сколько необходимо для размещения на экране. Когда вы прокручиваете таблицу вниз, и ячейка исчезает из верхней части экрана, она перемещается в нижнюю часть.
Ваш метод делегата tableView:cellForRowAtIndexPath:
отвечает за настройку ячейки, либо за создание новой, либо за перенастройку переработанной ячейки .
Надо использовать массив для хранения проверенных / непроверенных значений. Когда вызывается didSelectRowAtIndexPath:
, вы обновляете ячейку и ваш массив. Когда вызывается tableView:cellForRowAtIndexPath:
, вы настраиваете ячейку на основе значений в массиве.
Судя по вашим комментариям, вы уже поступаете правильно в didSelectRowAtIndexPath:
; вам просто нужно использовать эти значения при настройке экземпляра ячейки, потому что эта ячейка может представлять строку, которая уже была проверена. Проверьте массив и затем установите cell.accessoryType
соответственно.