はじめに
今日は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
されない - グローバルプロパティはグローバルにアクセスが必要な場合に利用する
- スタティックプロパティは特定のクラス内に定義して利用することで、その役割を明確にして利用する
ということで本日はここまで。