更新
这是行不通的。从dequeueReusableCellWithIdentifier返回的单元内存从不释放。
如果使用非零的reuseIdentifier初始化单元格,那么该单元格将不会被释放,直到tableView本身被释放。即使调用了[[tableView valueForKey:@“reusableTableCells”] removeAllObjects],情况也是如此。不幸的是,tableView将单元保留在其他私有成员中,并且释放它的唯一方法是销毁tableView。
简答
的回答如何清除的tableView细胞缓存是,苹果不提供“ClearReusableCells”功能问题的标题,但它是相当容易实现自己。只需跟踪上次清除tableView的缓存的时间并跟踪单元格创建的时间。如果一个单元格是在tableView上次缓存刷新时间之前创建的,则该单元格被认为是脏的。
替代
史蒂芬Canfield的答案 - 这是一个很好的回答的具体问题,但它并没有很好地扩展,如果有可以相互独立地改变多个属性。在这种情况下,你可以很快拥有很多'模式',并且可能无法管理。此外,就内存使用而言,确实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
结帐我的回答类似的问题:http://stackoverflow.com/questions/2286669/iphone-how-to-purge-a-cached-uitableviewcell/15832337#15832337 –