2012-03-20 3 views
1

Я хотел бы создать Singleton с ARC,
this is the answer I see.Создать Singleton с 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(). Эта функция гарантирует, что предоставленный вами блок запускается не более одного раза во время выполнения вашего приложения. Если код, создающий ваш синглтон, находится внутри блока, который вы переходите на dispatch_once(), вы знаете, что два потока в вашем приложении не могут одновременно пытаться получить доступ к общему объекту и, возможно, создать его дважды.

Есть ли причина, по которой вы не хотите использовать блок?

+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 и посмотреть, работает ли этот код синхронизации так же, как ваш. Спасибо, что ответили. –

Смежные вопросы