[Swift]メモリリーク確認用デバッグのTips

2812 ワード

メモリリーク確認方法

  1. 赤丸の「Show the Debug navigator」 で確認する
  2. ビルド後に「Debug Memory Graph」をタップ
  3. 例として下図のようにVCなどの中のコンポーネントで何が残っているか確認出来る
  4. もしリークを確認し、該当箇所を調査したい場合は、
    Edit Sceme -> Run -> Diagnostics -> Malloc Stack Loggingにチェック

メモリーリークの解消方法

上記のやり方で該当のコンポーネントや、リークしているソースの場所は分かるが、
そこからの修正は様々なパターンがあり、対処も変わってくる。
ここではよくあるリークの原因である循環参照についてその対策を挙げていく。

Delegate

delegateを定義する際は、循環参照を避けるためにweakをつけて宣言する必要がある。

class SampleViewController: UIViewController {
    weak var delegate: SampleViewControllerDelegate?
}

クロージャ

クラス内でプロパティとしてクロージャを保持する場合、
必ずselfの参照を弱参照にする必要がある。(weak self

// プロパティ用意
var closure: (String) -> Int

// selfを弱参照にする
let sampleClosure = {[weak self] string in
  return string.count
}
// クロージャをプロパティで保持
closure = sampleClosure