1

私はObjective-Cを始めたばかりで、シングルトンの作成に関するこの例に出くわしました:

 + (BNRItemStore *) sharedStore
 {
       static BNRItemStore *sharedStore = nil;
       if (!sharedStore)
            sharedStore = [[super allocWithZone:nil] init];

      return sharedStore;
 }

私は彼が何をしようとしているのか理解しています - それは、同じインスタンスが存在する場合はそれを返し、存在しない場合は新しいインスタンスを作成することです。気になるのは次の行です。

 static BNRItemStore *sharedStore = nil;

この行は、メソッドが呼び出されるたびに sharedStore を nil 値にリセットしませんか? この行が常に nil に設定されている場合、メソッドが以前に存在したインスタンスを返す方法がわかりません。

前もって感謝します。

4

2 に答える 2

4

これは、Objective-C が標準 C から継承する要素です。(型指定子が明示的に宣言する)静的記憶域期間を持つ変数は、一度だけ初期化され、c 標準では、これはプログラムの開始前に発生すると述べています。static

6.2.4 3) 識別子が外部リンケージまたは内部リンケージ、またはストレージ クラス指定子 static で宣言されているオブジェクトは、静的ストレージ期間を持ちます。その存続期間はプログラムの実行全体であり、格納された値はプログラムの起動前に一度だけ初期化されます。

静的ストレージ期間を持つ変数が「ポインター型」の場合、自動的に NULL ポインター (nil とは何か) に設定されることにも言及しているため、必要に応じ= nilて宣言の一部を省略できます。関数の可読性が向上すると思われる場合。

于 2012-08-25T04:33:47.047 に答える
1

この行は、メソッドが呼び出されるたびに sharedStore を nil 値にリセットしませんか?

sharedStoreisであるため、最初に呼び出されたときstaticに初期化 (= nilビット) されます。以降の呼び出しでは、これらの命令がスキップされます。

この行が常に nil に設定されている場合、メソッドが以前に存在したインスタンスを返す方法がわかりません。

これはstatic変数であり、その値はメソッドが終了した後もメモリに残るためです。

基本的に、これはグローバル変数と考えることができますが、アクセスできるのは+sharedStore.

于 2012-08-25T04:27:04.840 に答える