0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UITableViewCellがdeinitされるタイミング

Posted at

検証

以下のようなコードで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:)等で
 既にインスタンス化されているカスタムセルを再利用できるようになっており、
 必要に応じて利用するためにインスタンスを保持し続けるから。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?