検証
以下のようなコードでUITableViewCellのカスタムセルを作成し、
UITableViewのインスタンスメソッドである
・register(_:forCellReuseIdentifier:)
・dequeueReusableCell(withIdentifier:)
の2つを使用してカスタムセルを表示させ、インスタンスが解放されるタイミングを検証してみた。
SampleTableViewCell.swift
final class SampleTableViewCell: UITableViewCell {
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var urlLabel: UILabel!
func configure(model: Model) {
self.titleLabel.text = model.fullName
self.urlLabel.text = model.urlString
}
deinit {
print("deinit")
}
}
SampleViewController.swift
final class SampleViewController: UIViewController {
var models = [Model]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib.init(nibName: "SampleTableViewCell", bundle: nil), forCellReuseIdentifier: "SampleTableViewCell")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: SampleTableViewCell.className) as? SampleTableViewCell else {
fatalError()
}
let model = models[indexPath.row]
cell.configure(model: model)
return cell
}
}
※SampleViewControllerは一部のコードを抜粋
結果
親のUITableViewが解放されるタイミング(画面遷移など)でカスタムセルも解放された。
tableViewのregister(_:forCellReuseIdentifier:)を行うと、
カスタムセルは初期化された後、その親であるUITableViewが存在する限りは解放されない。
なぜかというと、dequeueReusableCell(withIdentifier:)等で
既にインスタンス化されているカスタムセルを再利用できるようになっており、
必要に応じて利用するためにインスタンスを保持し続けるから。
参考