2017-02-13 5 views
-2

私は別のプログラミング言語を使いました。私はシングルトンパターンを理解することができます。しかし、私はObjectiveCのSingleton Implementationを混乱させました。目的C - 静的変数を1回だけ初期化しますか?

実際、私は静的変数の有効期間を理解しています。しかし、なぜ静的変数を1回だけ初期化するのですか?コンピュータプログラミングにおいて

@implementation MyManager 

+(instancetype)sharedInstance { 

    // structure used to test whether the block has completed or not 
    //Doubt 1 - If this method called second time, how it is not reset again to 0. How it is not executed second time? 
    static dispatch_once_t p = 0; 

    // initialize sharedObject as nil (first call only) 
    //Doubt 2 - If this method called second time, how it is not reset again to nil, How it is not executed second time? 
    __strong static MyManager * _sharedObject = nil; 

    // executes a block object once and only once for the lifetime of an application 
    dispatch_once(&p, ^{ 
     _sharedObject = [[self alloc] init]; 
    }); 

    // returns the same object each time 
    return _sharedObject; 
} 

@end 
+0

静的変数のみが一度初期化されます。それを簡単に確認することができます。おそらく他のいくつかの質問に重複しています。あなたの質問を明確に述べてください。私はそれを読んでいるほとんどの人が他の人のコメントに隠された質問を逃すだろうと思う。 –

+2

あなたの混乱は 'static'キーワードの周りを回っているようだ。目的CはC言語から継承し、まったく同じように動作します。 http://stackoverflow.com/a/572550/3141234 – Alexander

+0

ここをクリックhttp://stackoverflow.com/a/16208466/3110026 –

答えて

2

静的変数は、その寿命または「エクステント」はプログラムの全体の実行を横切って延びるように静的に割り当てられた変数です。

https://en.wikipedia.org/wiki/Static_variable

+0

実際には、私は静的変数の寿命を理解します。しかし、私の疑問は、 "何が静的変数を1回だけ初期化するのか"です。 http://stackoverflow.com/questions/5567529/what-makes-a-static-variable-initialize-only-once – partikles

+0

@particleでクリアされましたあなたの質問に答えましたか?その場合は、回答の1つを受け入れてください。 – Alexander

+0

ありがとう、私は答えを得た。 – partikles

1

dispatch_onceへの呼び出しは、それが一度だけ初期化します。

dispatch_onceは、静的メモリ位置へのポインタをとります。場合

lock location; if anyone else has locked location, block until we can 
if (location is unset) { 
    do_thing 
    set location 
} 
unlock location 

しかし、それは(それが特殊なCPU命令を必要としません、しかし、「コンペア・アンド・スワップ」と呼ばれて)本物のロックを必要としない、はるかに高速な方法でこれを行います。これは、効果的に次のことを行います詳細はMike Ash's excellent explanationを参照してください。しかし、ほとんどの用途では、dispatch_onceを正しく使用すると、プログラムの実行ごとに1回しか実行されないということを受け入れることができます。

関連する問題