クラス変数を使いたい。次の2つのアプローチはうまく機能しますが、それらの違いはわかりません。
static NSString *str1 = @"str1";
NSString *const str2 = @"str2";
@implementation StrViewController
クラス変数を使いたい。次の2つのアプローチはうまく機能しますが、それらの違いはわかりません。
static NSString *str1 = @"str1";
NSString *const str2 = @"str2";
@implementation StrViewController
場所をポイントしている場所に変更できますが、constポインターであるstr1
ため同じことはできませんstr2
これは動作します:
str1 = @"Hello";
これはしませんが:
str2 = @"Hello";
static
変数がまたはである必要はないことがわかると思いますconst
。それをクラス変数にしているのは、それがメソッドや関数の外にあるということです。
名前にもかかわらず、static
静的である(つまり同じままである)こととは何の関係もありません。これは非常に残念な用語の選択ですが、Cから来ており、私たちはそれに固執しています。変数static
のスコープと関係があります。これは、ファイルの範囲内で、特定のメソッド/関数の外部で、ファイルのレベルで実装されます。これは2つの方法で使用されます。
メソッドまたは関数のstatic
外部では、このファイルの外部からグローバル変数が表示されないようにします。別のクラスからの静的NSString*constの参照を参照してください。
メソッドまたは関数の内部では、メソッドstatic
または関数が「自動」変数のように終了したときに変数が存在しなくなるのではなく、ストレージをファイル全体に結び付けます。Cの発明者自身が述べているように(K&R 4.6):
自動とは異なり、機能がアクティブになるたびに行き来するのではなく、存在を再確認します。これは、内部
static
変数が単一の関数内にプライベートで永続的なストレージを提供することを意味します。
そのためstatic
、クラスで販売されたシングルトンの実装で使用されます。