UITableView reloadData の罠
21/06/15 23:11
iOS プログラミングで、UITableViewのセルを頻繁に更新したいときに、reloadDataを使うと罠にはまる。
というのも、古いセルに割り当てられたメモリが解放されず、どんどんメモリ使用量がたまっていく。
これはUIView関係のautoreleaseのタイミングのせいで、仕方ない。
UITableView reloadData many times cause memory leak and slow down application
http://stackoverflow.com/questions/4029603/uitableview-reloaddata-many-times-cause-memory-leak-and-slow-down-application
この現象。
ここでの答えは、 reloadRowsAtIndexPaths:withRowAnimation: を使え、ということだったが、確かにメモリ量はふえないが、例えばセンサデータのような高速に切り替わるデータを扱うときは、更新してる様子は見れたもんじゃない。
正しいやり方は、reloadDataを使わず、セルの中の一部だけ(この場合はセンサデータを表示するUILabelだけ)更新してやる。
ここが参考になる。
//for cell updating
- (void)updateCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
// セルの中身をアップデートの例。この場合は4のTagでとってこれるUILabelの値を変更できる。
((UILabel*)[cell viewWithTag:4]).text =[[dataArray objectAtIndex:indexPath.row] value];
}
- (void)updateVisibleCells {
for (UITableViewCell *cell in [tableView visibleCells]){
[self updateCell:cell atIndexPath:[tableView indexPathForCell:cell]];
}
}
こういうメソッドを用意してやって、updateVisibleCellsを呼べば、見えてる場所のセルの中身だけ更新されるし、
きちんと一つだけの更新したい場合は、updateCellだけ呼べばOK。