56449


SwiftのUITableviewでdequeueReusableCellというメソッドがあります。  
本などには再利用可能なセルを取得とありますが、何の再利用なのでしょうか？  
インスタンス化されたセルなのか、なんなのかわからず。  
使う分には気にしなくてもいいと思いますが、内容をきちんと理解しておきたく、ご存知の方ご教示お願いします。


CC BY-SA 4.0
2019-07-06T03:03:15.067
56442
2019-07-06T08:22:14.187
8593
question
swift4
swiftのtableviewのdequeueReusableCellの再利用とは


「インスタンス化されたセル」です。

* * *

と結論だけではあまりにもあれなんで、もう少し補足を。

この動作を理解するためには、「`UIView`のインスタンス化は意外と重い」ということを意識しておかないといけません。

[`UIView`](https://developer.apple.com/documentation/uikit/uiview)

`UIView`なり、そのサブクラスである`UITableViewCell`にちょっとした構造(storyboardでデザインするような、色々なコントロールや子viewが貼り付けられた階層構造)がある場合、そのインスタンス化は「iOS的には割と重い処理」になります。

`UIView`は上記した「`view`間の階層構造を保持する」機能以外に、制約でそれらの位置関係を動的に維持・管理する機能、アニメーションや変形のサポートとそのためのlayerや、描画結果のキャッシュ管理、イベント処理などなど、非常に多彩な処理を内部的に行なっており、インスタンス化するだけでもちょっとした負荷になる事柄なのです。

`UITableView`なんかでは、ユーザが画面をひたすらスクロールする、なんてことは非常によく見られる操作であり、それがもたつくとユーザは非常にイライラするものです。(この際、`tableView(:cellForRowAt:)`が繰り返し呼ばれます。)iOSでは、その場合のレスポンスを少しでも改善するため、インスタンス化の手間だけでもできるだけ減らそうとしているわけです。

* * *

正直、今日のハイエンドのiPhoneなんかを使って開発していると、`dequeueReusableCell`を使わずに「毎回イニシャライザを呼んでいる」ようなコードを書いても、簡単には差が感じられなくなってきています。ただ、ちょっと難しいテストをすれば十分わかる程度の差がつきますし、お約束を守れば良いだけなので、今後も「`tableView(:cellForRowAt:)`を実装する際には必ず`dequeueReusableCell`を使うべき」という推奨パターンは変わらないだろうと思います。


CC BY-SA 4.0
2019-07-06T08:22:14.187
56449
2019-07-06T08:22:14.187
13972
56442
answer