はじめに
今日はSwiftでグローバルプロパティを定義した時の挙動についてのメモです。
Swiftではプロパティを定義する時に、わざと遅延評価させるための lazy という修飾子があります。
lazy をつけることで、そのプロパティが利用される時に、初期化されメモリが消費されるため、メモリの効率性を上げることに一役買います。
実際の定義は下記の通りです。
1 2 3 4 5 6 | |
これがSwiftで グローバルプロパティ や スタティックプロパティ を定義した時に自動的に付与されます。
実験
では、実際に実験してみましょう。
事前準備
まずは下記のような Sample クラスを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
そして、下記のような Storyboard を用意します。

各種機能を箇条書きで述べると下記の通りです。
- 中央の『
Next Page』ボタンを持つVCがFirstViewController - 右端のVCが
SecondViewController FirstViewControllerの『Next Page』ボタンをタップするとSecondViewControllerに遷移するSecondViewControllerに各種プロパティを定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
実験結果
準備が整ったので、実際に挙動を見ていきましょう。
まずは、 FirstViewController の『Next Page』をタップして SecondViewController に遷移した場合です。
結果は、
1 2 3 4 | |
の順番でログが出力されました。
このことから、
local_propはSecondViewController初期化時に初期化されるglobal_propはアクセス時に初期化されるlocal_lazy_propはアクセス時に初期化されるstatic_propはアクセス時に初期化される
ことがわかります。
続いて、 SecondViewController のナビゲーションバーの『Back』をタップして前の画面に戻ってみます。
1 2 3 | |
のようにログが出力されました。
このことから、
local_propはSecondViewControllerがdeinitされるタイミングでdeinitされるlocal_lazy_propはSecondViewControllerがdeinitされるタイミングでdeinitされるglobal_propはSecondViewControllerがdeinitされてもdeinitされないstatic_propはSecondViewControllerがdeinitされてもdeinitされない
ことがわかります。
さらに、再度 FirstViewController の『Next Page』をタップして SecondViewController に画面遷移してみます。
すると、
1 2 | |
のようにログが出力されました。
このことから、
local_propはSecondViewController初期化時に初期化されるlocal_lazy_propはアクセス時に初期化されるglobal_propとstatic_propは既に初期化済みなので、初期化されない
ことがわかります。
グローバルプロパティ vs スタティックプロパティ
因みに、グローバルプロパティとスタティックプロパティの挙動は下記の点で似ています。
- 特定のクラスを初期化しなくても利用できる
- 特定のクラスが
deinitされてもプロパティ自体はdeinitされない
そうなると、グローバルプロパティとスタティックプロパティそれぞれ使い分けに疑問を抱くかもしれません。
しかしながら、この2つは全く利用用途が異なります。
- グローバルプロパティ
- グローバルにアクセスする必要がある場合に利用する
- 特定のクラスに依存するような関係性を持たない
- 名前空間はグローバル(全体)に影響があるため、十分注意が必要
- スタティックプロパティ
- 特定のクラスを初期化せずともアクセスする必要がある場合に利用する
- 特定のクラスに依存する関係性ではある
- 特定のクラスを初期化せずとも利用できるが、特定のクラスが持つ役割に含まれる
- 名前空間は特定のクラス内に留まる
上記から、より適切な使い分けをするように気をつけましょう。
まとめ
ではまとめます。
- グローバルプロパティは自動で
lazy付与と同じ扱いになる - スタティックプロパティは自動で
lazy付与と同じ扱いになる - グローバルプロパティとスタティックプロパティは特定のクラスが
deinitされてもdeinitされない - グローバルプロパティはグローバルにアクセスが必要な場合に利用する
- スタティックプロパティは特定のクラス内に定義して利用することで、その役割を明確にして利用する
ということで本日はここまで。