cellForRowAtIndexPath が呼ばれるタイミングとは?

2つ目のiOSアプリケーション:ストーリーボードを読み進めている中で、P41 に以下のような記述を見つけました。

TableViewオブジェクトは、テーブルの行を表示する必要が生じるたびに cellForRowAtIndexPathメソッドを呼び出します。

そこで実際にこのメソッドが呼ばれるタイミングは何時なのか気になりました。日本語ドキュメントの一覧を眺めてみるとiOS Table Viewプログラミングガイドというドキュメントがありましたので、少し読んでみました。
cellForRowAtIndexPathというキーワードで pdf内を検索してみると、いくつか情報が見つかりました。P48 に以下のような記述があります。

次に、tableView:cellForRowAtIndexPath:メソッドを繰り返し呼び出して、表示する各行のセルオブジェクトを取得します。Table Viewは、このUITableViewCellオブジェクトを使用して、その行のコンテンツを描画します(Table Viewがスクロールされた場合にも、新たに表示する行に対してtableView:cellForRowAtIndexPath:が呼び出されます)。

ここには、スクロールされた場合もメソッドが呼び出されるという事が記載されています。どんな風に処理されるのか気になったので、シンプルな Master-Detailアプリを作ってtableView:cellForRowAtIndexPath:にログを仕込んでみることにしました。

NSLog(@"row: %d, count: %d", indexPath.row, [_objects count]);

アプリを動かしてADDボタンを押してみると、メソッドが呼ばれているのがログ出力でわかります。

2013-03-29 02:59:48.819 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 1

続いてADDボタンを連打して画面をデータ埋めてみました。

2013-03-29 02:59:49.380 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 2
2013-03-29 02:59:49.901 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 3
2013-03-29 02:59:50.375 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 4
2013-03-29 02:59:50.815 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 5
2013-03-29 02:59:51.250 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 6
2013-03-29 02:59:51.707 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 7
2013-03-29 02:59:52.180 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 8
2013-03-29 02:59:52.710 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 9
2013-03-29 02:59:53.238 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 10

その後上下に画面をスクロールすると面白いログ出力がおこなわれました。
下にスクロール

2013-03-29 02:59:56.550 TrialCellForRowAtIndexPath[53532:c07] row: 1, count: 10
2013-03-29 02:59:56.701 TrialCellForRowAtIndexPath[53532:c07] row: 0, count: 10

上にスクロール

2013-03-29 03:00:07.474 TrialCellForRowAtIndexPath[53532:c07] row: 8, count: 10
2013-03-29 03:00:07.592 TrialCellForRowAtIndexPath[53532:c07] row: 9, count: 10

画面内にセルが入るタイミングでメソッドが呼ばれているのがわかります。一度描画したものは保存されているのかと思っていましたが、そうではないようです。この辺りは描画に関するロジックの理解が必要なのかもしれません。

結論

ドキュメント記載されている通りでした。表示するセルができるたびにメソッドは呼ばれていました。