note


UITableView reloadData の罠

iOS プログラミングで、UITableViewのセルを頻繁に更新したいときに、reloadDataを使うと罠にはまる。
というのも、古いセルに割り当てられたメモリが解放されず、どんどんメモリ使用量がたまっていく。
これはUIView関係のautoreleaseのタイミングのせいで、仕方ない。

Pasted Graphic


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。