はじめに
iOSアプリ開発において、UITableViewCellやUICollectionViewCellを利用する場面は多いと思いますが、セルの再利用について考えることは避けて通れません。私はセルの初期化タイミングってこれで良いのだっけと思いつつ、なんとなくprepareForReuse()メソッド内にセルの初期化処理を書いていました。
私と同じように
「とりあえずprepareForReuse()に初期化処理を書いとけば良いや」
と何となく書いていた方もいるのではないでしょうか。
この記事では、セルの再利用時の初期化方法について、
- 再利用時によく使うprepareForReuse()のドキュメントを改めて読む
- セルの初期化処理の書き方の一例を紹介
の順にまとめました。
prepareForReuse()
テーブルビューのデリゲートが再利用できるように、再利用可能なセルを準備します。
https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse

UITableViewCellオブジェクトに再利用識別子がある場合、テーブルビューは、UITableViewメソッドdequeueReusableCell(withIdentifier:)からオブジェクトを返す直前に、このメソッドを呼び出します。潜在的なパフォーマンスの問題を避けるために、コンテンツに関連しないセルの属性、例えば、透明度、編集・選択状態などのみをリセットする必要があります。tableView(_:cellForRowAt:) のテーブルビューのデリゲートは、セルを再利用するとき、常にすべてのコンテンツをリセットする必要があります。
と翻訳しただけですが、これによるとprepareForReuse()内で初期化するべきものは、セル自体の属性のみに留めることが推奨されています。セル上のコンポーネントの初期化は避けた方が良く、tableView(_:cellForRowAt:)で初期化してあげるのが良さそうです。
初期化の実装例
セルの属性はprepareForReuse()内で、それ以外はtableView(_:cellForRowAt:)内で初期化処理を書きます。

上記のように、3つのUILabelコンポーネントをtableView(_:cellForRowAt:)で初期化したい場合は、publicなメソッドを用意してその中で初期化処理を書いてあげるとViewController側で使用できます。

終わりに
ドキュメントに従いましょうという話ですが、意外と気にせず初期化処理が書かれているのを見かけるので私も今後は気を付けたいと思います。 (どれくらいパフォーマンスに影響するかは調べられておらずです🙇♂️)
参考文献
この記事は、以下の情報を参考に書いています。