23
22

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 5 years have passed since last update.

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

Last updated at Posted at 2019-04-03

はじめに

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

関連記事

[図解]SwiftでARCのメモリ解放の仕組みを理解するために実施したこと(weak版)
[図解]SwiftでUIAlertControllerが何故循環参照するのかを理解するために実施したこと

環境

Xcode 10.1
Swift 4.2

作成したプロジェクト一式

https://github.com/sakamotoyuya/proj2
スクリーンショット 2019-04-02 2.10.04.png

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

参照関係の図

スクリーンショット 2019-04-03 21.26.15.png

(2)にnilを入れたときのARCの動作

スクリーンショット 2019-04-03 21.26.21.png
スクリーンショット 2019-04-03 21.26.27.png
スクリーンショット 2019-04-03 21.26.34.png
スクリーンショット 2019-04-03 21.26.41.png

(3)にnilを入れた時のARCの動作

スクリーンショット 2019-04-03 21.26.51.png
スクリーンショット 2019-04-03 21.27.00.png
スクリーンショット 2019-04-03 21.27.06.png

(1)にnilを入れた時のARCの動作

スクリーンショット 2019-04-03 21.27.14.png
スクリーンショット 2019-04-03 21.27.21.png
スクリーンショット 2019-04-03 21.27.28.png
スクリーンショット 2019-04-03 21.27.35.png
スクリーンショット 2019-04-03 21.27.43.png
スクリーンショット 2019-04-03 21.27.52.png

ここまでやってみて

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

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

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

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

次回はUIAlertControllerのクロージャーを含めた参照関係を作成してARCによるメモリ解放の流れを確認していきます。

23
22
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
23
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?