はじめに
前回に引き続きARCのメモリ解放の仕組みを、インスタンスの参照関係を操作可能なプログラムを作って動作確認を行いました。
今回はweak(弱参照)ではなくunowned(非所有参照)を含めた参照関係を作成してARCによるメモリ解放の流れを確認して結果を図解でまとめています。
関連記事
[図解]SwiftでARCのメモリ解放の仕組みを理解するために実施したこと(weak版)
[図解]SwiftでUIAlertControllerが何故循環参照するのかを理解するために実施したこと
環境
Xcode 10.1
Swift 4.2
作成したプロジェクト一式
https://github.com/sakamotoyuya/proj2
このプログラムは(1)から(5)のメモリを以下の参照関係となるように作成して、いずれかのメモリをnilにしたとき、ARCのメモリ解放がどう動くのかを確認できるものとなっています。
色々試してみてこんな感じで動いたというのを図解でまとめました。
参照関係の図
(2)にnilを入れたときのARCの動作
(3)にnilを入れた時のARCの動作
(1)にnilを入れた時のARCの動作
ここまでやってみて
今回の実験からweakとunownedについて「(2)にnilを入れたときのARCの動作」のみ結果に差分が出ました。
参照タイプ毎の動作の差分内容は以下の通りです。
参照タイプ | 動作差分 |
---|---|
weak (弱参照) |
弱参照先から自分への強参照が外れた場合はnilとなる。 ※アクセスした場合であってもnilアクセスでなければアプリが落ちない。 |
unowned (非所有参照) |
非所有参照先から自分への強参照が外れた場合はメモリ解放されてアクセス不可となる。 ※アクセスした場合はアプリが落ちる。 |
weakもunownedもどちらも参照先のリファレンスカウンタをカウントアップしない性質ですので、これらの参照タイプを使用する目的は**「循環参照させないようにすること」**だと思います。
どちらの参照タイプを使用するにしても、上記表の動作差分について意識して設計したいものです。
次回はUIAlertControllerのクロージャーを含めた参照関係を作成してARCによるメモリ解放の流れを確認していきます。