Создать синглтон с ARC без использования блока - PullRequest
1 голос
/ 21 марта 2012

Я хотел бы создать синглтон с 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;
    }
}

помешает ли это объекту, созданному более одного?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Да, вы можете использовать другой механизм синхронизации, например, мьютекс.

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 голос
/ 21 марта 2012

Есть ли способ преобразовать этот код во что-то похожее без использования блока?

Вы можете просто выделить свой общий объект, но тогда вы не получите защиту, которую предлагает dispatch_once(). Эта функция гарантирует, что блок, который вы передаете, выполняется не более одного раза во время выполнения вашего приложения. Если код, который создает ваш синглтон, находится внутри блока, который вы передаете dispatch_once(), вы знаете, что два потока в вашем приложении не могут одновременно пытаться получить доступ к общему объекту и, возможно, вызывают его создание дважды.

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

...