2012-03-20 6 views
1

ARCを使用してシングルトンを作成する場合は、
this is the answer I seeです。ブロックを使用せずにARCを使用してシングルトンを作成する

このコードをブロックを使用せずに同様のものに変換する方法はありますか?

+ (MyClass *)sharedInstance 
{ 
    static MyClass *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[MyClass alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedInstance; 
} 

EDIT:

私はこのアプローチを参照してください。

static MyClass *sharedMyClassInstance = nil; 

+(MyClass *) sharedMyClass 
{ 
    @synchronized(self) { 
     if (sharedMyClassInstance == nil) { 
      sharedMyClassInstance = [[self alloc] init]; 
     } 
     return sharedMyClassInstance; 
    } 
} 

これは、複数のを作成したオブジェクトを防ぐことができますか?

答えて

1

ブロックを使用しなくても似たようにこのコードを変換するためにとにかくはありますか?

あなたは共有オブジェクトを割り当てることができますが、あなたはdispatch_once()が提供する保護を取得できません。この関数は、ブロックを与えたときにアプリの実行中に1回だけ実行されることを保証します。シングルトンを作成するコードがdispatch_once()に渡されたブロックの内部にある場合、アプリケーション内の2つのスレッドが共有オブジェクトに同時にアクセスすることはできず、2回作成される可能性があります。

ブロックを使用しない理由はありますか?

+0

iOS 3.xをサポートしたいので、非ブロックコードを書いてみたいです。 –

+1

iOS 3はARCをサポートしていません。 – Caleb

+0

そうですね。 http://stackoverflow.com/questions/9646607/arc-works-for-ios-3-x-what –

3

はい、ミューテックスのような別の同期メカニズムを使用できます。

static MyClass *sharedInstance = nil; 
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
static volatile BOOL initialized = NO; 

pthread_mutex_lock(&mutex); 

if (! initialized) { 
    initialized = YES; 
    sharedInstance = [[MyClass alloc] init]; 
    // Do any other initialisation stuff here 
} 

pthread_mutex_unlock(&mutex); 
return sharedInstance; 
+1

+1良い答え。 – Caleb

+0

私のEDITを見て、その同期コードがあなたのものと同じように動作するかどうか確認してください。しかし、あなたに答えてくれてありがとう。 –

関連する問題