Обновление
Это не работает. Память для ячейки, которая возвращается из dequeueReusableCellWithIdentifier, никогда не освобождается.
Если вы инициализируете ячейку с отличным от nil reuseIdentifier, то эта ячейка НЕ будет освобождена, пока не будет освобожден сам tableView. Это верно, даже если вызывается [[tableView valueForKey: @ "reusableTableCells"] removeAllObjects]. К сожалению, tableView сохраняет ячейку в каком-то другом закрытом элементе, и единственный способ освободить ее - уничтожить tableView.
Короткий ответ
Ответ на заголовок вопроса о том, как очистить кеш ячеек tableView, заключается в том, что Apple не предоставляет функциональность «ClearReusableCells», но ее достаточно легко реализовать самостоятельно. Просто отследите время последней очистки кэша tableView и отследите время создания ячейки. Ячейка считается грязной, если она была создана до последнего времени обновления кэша tableView.
Альтернатива
Ответ Стивена Кэнфилда - Это хороший ответ на конкретный вопрос, но он плохо масштабируется, если есть несколько атрибутов, которые можно изменять независимо друг от друга. В этом случае вы можете очень быстро иметь много «режимов», и это может стать неуправляемым. Кроме того, в отношении использования памяти верно, что код Apple отвечает за управление памятью, но также верно и то, что библиотека не может знать, когда конкретный идентификатор может понадобиться снова, поэтому она, скорее всего, в конечном итоге будет хранить эти кэшированные ячейки дольше, чем нужно.
Воссоздать tableView - это механизм грубой силы, который гарантированно очищает кэш ячейки. К сожалению, воссоздать tableView обычно неудобно.
Ответ Джейка Даля на альтернативный вопрос - Это хороший механизм для очистки кэша, который, вероятно, работал во время его написания, но он опирается на некоторые реализации, которые Apple не гарантирует, и которые имеют в Факт уже изменился.
Осуществление
Существует несколько способов отслеживания времени обновления кэша tableView и времени создания ячейки. Ниже показан механизм, который использует подклассы. Конечно, чтобы это работало, вам нужно убедиться, что код, который создает экземпляр таблицы и ячейки, создает экземпляры подклассов.
@interface MyTableView : UITableView
@property(nonatomic,assign) NSTimeInterval cellCacheRefreshTime ;
@end
@interface MyTableViewCell : UITableViewCell
@property(nonatomic,assign) NSTimeInterval creationTime ;
@end
@implemetation MyTableView
-(void) refreshCellCache {
self.cellCacheRefreshTime = [NSDate timeIntervalSinceReferenceDate];
}
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier {
MyTableViewCell *cell = (id)[super dequeueReusableCellWithIdentifier:identifier] ;
if( cell.creationTime < aTableView.cellCacheRefreshTime ) {
return nil ;
}
return cell ;
}
@end
@implemetation MyTableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier] ;
self.creationTime = [NSDate timeIntervalSinceReferenceDate];
return self ;
}
@end