2

私が勉強を続けるにつれて、本はシングルトンを実装しました。それを使用する理由は理解しましたが、コードに関する明確化が必要でした。

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

    return defaultStore;
}

static BNRItemStore * defaultStore = nil;returnステートメントまでの行で。私の質問は; このクラスを呼び出すたびに[[BNRItemStore defaultStore] someMethod];、別のクラスまたはアプリの一部で、defaultStore 変数が nil に設定されますか?

乾杯

4

5 に答える 5

3

staticキーワードには 2 つの効果があることを理解することが重要です。1 つは、メソッドが呼び出される前にその変数を存在させ、メソッドが返された後も永続化して、次の呼び出しで使用できるようにすることです。もう 1 つの影響はより微妙です。静的変数を初期化する「代入」は、メソッドが呼び出されたときではなく、コードがロードされたときに実行されます。したがって、すべての呼び出しで再初期化されるわけではありません。

ただし、変数はメソッドの「外部」に存在するため、その名前は一意である必要があります。このクラスまたは別のクラスの別のシングルトンで同じ名前を使用しないでください。

于 2012-07-17T00:58:33.327 に答える
2

これは、静的ストレージ期間を持つ変数の初期化子です。値は、実行可能ファイルがメモリにロードされるときに設定されます。

静的ストレージ期間を持つすべての変数は自動的に 0 に設定されるため、値を明示的に nil に設定する必要はないことに注意してください。

于 2012-07-17T00:57:41.257 に答える
1

関数静的変数の場合、次の行

static BNRItemStore *defaultStore = nil;

割り当てではありません。むしろ、これは静的初期化であり、コードが最初に関数を通過するときに一度だけ発生します。後続の呼び出しではnil、非 nil 値を割り当てるため、値は になりません。

実装はシングルスレッド環境で安全です。並行環境では、何らかの形式の同期を追加する必要があります。

于 2012-07-17T00:56:03.540 に答える
0

静的変数は、関数/メソッドが最初に呼び出されたときに 1 回だけ初期化されます。その後、基本的に線が存在しないふりをすることができます。

于 2012-07-17T00:57:50.427 に答える
-1

Appleは次のようなものを推奨しています

+ (BNRItemStore *)defaultStore
{
    static BNRItemStore *defaultStore = nil;
    static dispatch_once_t done;
    dispatch_once(&done,
                  ^{ defaultStore = [BNRItemStore alloc]init];});
    return defaultStore;
}

上記のコードは ARC を前提としています - ARC を使用しない場合は、何もしないで保持、解放、自動解放、および解放メソッドを定義する必要があります。

于 2012-07-17T01:42:25.117 に答える