iOS---単例

1233 ワード

単例ではなく注入に依存することをできるだけ避けてください.メモリを占有し、グローバルなものの状態が変わりにくく、柔軟性が足りない.ただし、必ず使用する場合は、スレッドの安全なモードを使用して共有インスタンスを作成します.
GCDの場合はdispatch_once()関数でいいです.
+ (instancetype)sharedInstance{ 
static id sharedInstance = nil; 
static dispatch_once_t onceToken = 0;
 dispatch_once(&onceToken, ^{
 sharedInstance = [[self alloc] init];
 }); 
return sharedInstance;
}

dispatch_の使用once()は,コード同期を制御し,従来の約定俗成の用法に取って代わった.
+ (instancetype)sharedInstance{   //     
 static id sharedInstance;
 @synchronized(self) { 
if (sharedInstance == nil) {
 sharedInstance = [[MyClass alloc] init]; 
    } 
  } 
  return sharedInstance;
}

dispatch_once()の利点は、dispatch_once()は「何かを一度実行する」という意味で、私たちがやったようにします.これにより同時にpossible and sometimes prolific crashesを回避することができる.古典的な単一のオブジェクトは、1つのデバイスのGPSとその加速度センサ(動作センサとも呼ばれる)である.単一のオブジェクトはサブクラス化できるが,この方式が有用であることは非常に珍しい.所与のクラスのインタフェースが単一の例として使用される傾向にあるという証拠が必要である.したがって、sharedInstanceのクラスメソッドは、通常、1つのsharedInstanceを開示するだけで十分であり、書き込み可能な属性が露出する必要はありません.単一の例をオブジェクトのコンテナとして、コードやアプリケーションの面で共有しようとするのは、悪くて醜い設計です.NOTE:一例モードをクラスやクラスのインタフェースに適用すべきであるが、一例として使用する傾向にある(訳者注)
文/CSNA(著者)原文リンク:http://www.jianshu.com/p/7e1e6d8b9dcf著作権は作者の所有で、転載は作者に連絡して許可を得て、そして“作者”を表示してください.