[図解]SwiftでARCのメモリ解放の仕組みを理解するために実施したこと(unowned版)

#はじめに
[前回](https://qiita.com/sakamotoyuya/items/9eecf8412b6138169df0)に引き続きARCのメモリ解放の仕組みを、インスタンスの参照関係を操作可能なプログラムを作って動作確認を行いました。
今回はweak(弱参照)ではなくunowned(非所有参照)を含めた参照関係を作成してARCによるメモリ解放の流れを確認して結果を図解でまとめています。

##関連記事
[[図解]SwiftでARCのメモリ解放の仕組みを理解するために実施したこと(weak版)](https://qiita.com/sakamotoyuya/items/9eecf8412b6138169df0)
[[図解]SwiftでUIAlertControllerが何故循環参照するのかを理解するために実施したこと](https://qiita.com/sakamotoyuya/items/6914bfd4f885ce7a8733)

#環境
Xcode 10.1
Swift 4.2

##作成したプロジェクト一式
https://github.com/sakamotoyuya/proj2
![スクリーンショット 2019-04-02 2.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/377612/32b9429e-cec4-0873-ae6f-6b7eeec9210a.png)

このプログラムは(1)から(5)のメモリを以下の参照関係となるように作成して、いずれかのメモリをnilにしたとき、ARCのメモリ解放がどう動くのかを確認できるものとなっています。
色々試してみてこんな感じで動いたというのを図解でまとめました。

#参照関係の図
![スクリーンショット 2019-04-03 21.26.15.png](https://qiita-image-store.s3.amazonaws.com/0/377612/99aa019e-7f90-e223-762e-bc2587d04283.png)

#(2)にnilを入れたときのARCの動作
![スクリーンショット 2019-04-03 21.26.21.png](https://qiita-image-store.s3.amazonaws.com/0/377612/d3d2893c-1f59-1a07-4615-43de6caa7146.png)
![スクリーンショット 2019-04-03 21.26.27.png](https://qiita-image-store.s3.amazonaws.com/0/377612/520ece7d-6f12-16a6-e432-b3cf3e3f02a5.png)
![スクリーンショット 2019-04-03 21.26.34.png](https://qiita-image-store.s3.amazonaws.com/0/377612/97a2c485-291e-1c8b-287b-9f99f984b5eb.png)
![スクリーンショット 2019-04-03 21.26.41.png](https://qiita-image-store.s3.amazonaws.com/0/377612/873134a9-848a-1df8-89b2-cbf3c4e91867.png)

#(3)にnilを入れた時のARCの動作
![スクリーンショット 2019-04-03 21.26.51.png](https://qiita-image-store.s3.amazonaws.com/0/377612/f7e1f590-d402-0f2e-c65d-c0d2e8e77c0a.png)
![スクリーンショット 2019-04-03 21.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/377612/8ff09046-ba29-a0ab-d3c5-35ef874cb89b.png)
![スクリーンショット 2019-04-03 21.27.06.png](https://qiita-image-store.s3.amazonaws.com/0/377612/63b19f71-6968-79fb-6f76-d23215fef22a.png)

#(1)にnilを入れた時のARCの動作
![スクリーンショット 2019-04-03 21.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/377612/a0fa1465-969e-8b63-e00b-041f4fc79b08.png)
![スクリーンショット 2019-04-03 21.27.21.png](https://qiita-image-store.s3.amazonaws.com/0/377612/6d132f5b-7c8b-e185-2305-a78a0c1d3dec.png)
![スクリーンショット 2019-04-03 21.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/377612/fd21beba-f3f0-ae62-4e23-3a718813d1e3.png)
![スクリーンショット 2019-04-03 21.27.35.png](https://qiita-image-store.s3.amazonaws.com/0/377612/66a0a421-7daf-7ee0-e3b5-fa28878c678d.png)
![スクリーンショット 2019-04-03 21.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/377612/5adce8c1-7bc9-9ac9-57c9-30393598d3f0.png)
![スクリーンショット 2019-04-03 21.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/377612/d01fecc4-b9d5-2a53-a824-1e7dd48a429c.png)


#ここまでやってみて
今回の実験からweakとunownedについて「(2)にnilを入れたときのARCの動作」のみ結果に差分が出ました。

参照タイプ毎の動作の差分内容は以下の通りです。

| 参照タイプ         | 動作差分 |
|:-----------------|:------------------|
| weak<br>(弱参照)             |弱参照先から自分への**強参照が外れた場合はnil**となる。<br>※アクセスした場合であってもnilアクセスでなければアプリが落ちない。|
| unowned<br>(非所有参照)           |非所有参照先から自分への**強参照が外れた場合はメモリ解放されてアクセス不可**となる。<br>※アクセスした場合はアプリが落ちる。 |

weakもunownedもどちらも参照先のリファレンスカウンタをカウントアップしない性質ですので、これらの参照タイプを使用する目的は**「循環参照させないようにすること」**だと思います。
どちらの参照タイプを使用するにしても、上記表の動作差分について意識して設計したいものです。

[次回](https://qiita.com/sakamotoyuya/items/6914bfd4f885ce7a8733)はUIAlertControllerのクロージャーを含めた参照関係を作成してARCによるメモリ解放の流れを確認していきます。