Contentsいつ再利用されるのか?ではセル参照はいつ呼ばれるのか?どうやって再利用してるか調べるか?再利用してるならメモリ解放されないはず、つまりinitの呼ばれる回数は限られている再利用してるなら最後に利用したセルの状態が残っているUITableViewCell.prepareForReuse()が呼ばれている検証コードを実装するUITableViewCellのサブクラス整数以外は赤色にする実行してみる動画を見る出力されたログを見る再利用していることが分かったセル高さが狭いスクリーン解像度が高いセル種類数が多いバグ解決のヒントになるUITableViewCellは再利用セルとして使われていますが、どういった感じで再利用されているかイメージついてる初心者は少ないかと思います。イメージがついて再利用の利点が分かることで、より一層理解が深まると思います。いつ再利用されるのか?セル参照時です。メソッドが呼ばれるときです。tableView.dequeueReusableCell(withIdentifier:)メソッドが呼ばれており、このメソッドがIDをキーにインスタンスを参照しているためです。セル参照はいつ呼ばれるのか?セルが画面に表示される直前です。次のコードのように表示するデータをログとして出力するようにします。...}これを実行すると、下記画像のタイミングで次のログが出力されます。tableView(_:cellForRowAt:)4数字の4が呼ばれていることが分かります。これは画面に表示される直前です。やって再利用してるか調べるか?前提としてUITableViewCellは再利用されています。いっても実際に確認しないと分かりません。いうことで次の方法で検証します。再利用してるならメモリ解放されないはず、つまりinitの呼ばれる回数は限られている再利用してるなら最後に利用したセルの状態が残っているUITableViewCell.prepareForReuse()が呼ばれているこの3つで再利用されていることを検証します。再利用してるならメモリ解放されないはず、つまりinitの呼ばれる回数は限られているもしセルが再利用されていないのなら、たくさんのinitが呼ばれているはずです。セルが利用されているなら、画面表示に必要な数程度しか呼ばれないはずです。再利用してるなら最後に利用したセルの状態が残っている再利用する前に最後の状態が残っているはずです。数字のデータを表示したときに、背景色が残っているはずです。UITableViewCell.prepareForReuse()が呼ばれているApple公式によると、再利用可能なセルを準備するときに呼ばれるようです。dequeueReusableCell(withIdentifier:)メソッドを呼ぶと呼ばれるようです。コンテンツに無関係なセル属性をリセットしているみたいです。}}基本的なUITableViewの使い方です。分からない場合はこちらで解説してあります。何もしないとタップしてアラートが終わった後もタップした後が残ります。indexPa...加えて2点コード追加があります。UITableViewCellのサブクラスMyTableViewCellというUITableViewCellを継承したクラスを用意しています。これはセルのカスタマイズと違って、単純にinitとprepareForReuseメソッドをオーバーライドするためだけに用意しました。セルのカスタマイズに関してはこちらをどうぞ。簡単なユーザー情報を表示するテーブルを題材に話を進めます。ofにUITableViewCellを選んで作成すると、次のようなコードが生成されます。UIColor.red}データが整数以外、アルファベットならセル背景色を赤色にします。整数の場合は何もしません実行してみる実際に前述したコードを実行して動かしてみました。動画を見る最初は白色だった背景が、一度赤色にして戻ってきたら、赤色になっていることが分かります。セルを赤色にしてるのは、アルファベット時のみなので、再利用していることが分かります。出力されたログを見る次にログを抜粋しました。画面表示に必要なセル数がinitされた後、再利用されているのが分かります。tableView(_:cellForRowAt:)1init(style:reuseIdentifier:)tableView(_:cellForRowAt:)2init(style:reuseIdentifier:)tableView(_:cellForRowAt:)3init(style:reuseIdentifier:)tableView(_:cellForRowAt:)4init(style:reuseIdentifier:)tableView(_:cellForRowAt:)5init(style:reuseIdentifier:)tableView(_:cellForRowAt:)6init(style:reuseIdentifier:)tableView(_:cellForRowAt:)7init(style:reuseIdentifier:)tableView(_:cellForRowAt:)8init(style:reuseIdentifier:)tableView(_:cellForRowAt:)9init(style:reuseIdentifier:)tableView(_:cellForRowAt:)ainit(style:reuseIdentifier:)tableView(_:cellForRowAt:)bprepareForReuse()tableView(_:cellForRowAt:)cprepareForReuse()tableView(_:cellForRowAt:)dprepareForReuse()tableView(_:cellForRowAt:)eprepareForReuse()tableView(_:cellForRowAt:)fprepareForReuse()tableView(_:cellForRowAt:)7prepareForReuse()再利用していることが分かった検証結果を振り返り、再利用していることが分かりました。セルは画面を埋め尽くす程度の数だけインスタンスは用意され、スクロールすることでスクロールアウトするセルをスクロールインするセルに再利用していました。このことから次のケースは使用メモリが増えることが分かります。セル高さが狭いスクリーン解像度が高いセル種類数が多いセル高さが狭いスクリーンを埋め尽くすためのセル高さ幅が小さいとそれだけ必要になるセル数は増え、確保するインスタンスは増えます。スクリーン解像度が高いこちらもセル高さ同様です。セル種類数が多い今回はセル種類数は1種類ですが、これが複数種類になるとそれだけインスタンス数は増えます。最大で2種類なら2倍です。これはそのセルがどういった並びになるのかに依存します。バグ解決のヒントになる別観点として再利用してることで前の状態が残るので、想定とは異なるビュー状態になります。今後似たような症状が起きた場合は、再利用によるセルリセットし忘れを疑うことができるようになります。mothuleこのページはmothuleの技術ブログになります。当サイトに記載された情報により損害が発生しましても、責任は致しかねません。