2016-03-31 4 views
1

Пример кода 1:Objective-C одноточечно создание

+ (MyClass *)sharedInstance{ 
    static MyClass *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

Пример кода 2

+ (MyClass *)sharedInstance{ 
    static MyClass *sharedInstance = nil; 
    if (!sharedInstance) { 
     sharedInstance = [[MyClass alloc] init]; 
    } 
    return sharedInstance; 
} 

Существуют ли какие-либо различия в результате указанных выше образцов кода?

ответ

4

Первый из них лучше, так как он предотвращает создание нескольких экземпляров класса Singleton при использовании нескольких потоков при соблюдении необходимых условий.

Например: возьмите второй пример.

+ (MyClass *)sharedInstance{ 
    static MyClass *sharedInstance = nil; 
    if (!sharedInstance) { 
     sharedInstance = [[MyClass alloc] init]; 
    } 
    return sharedInstance; 
} 

Пусть Theread1 выполняет следующую LOC, а затем дает дескриптор Thread2

if (!sharedInstance) 

Теперь Thread2 выполняет следующие LOC, а затем руки на ручку, чтобы Thread1

sharedInstance = [[MyClass alloc] init]; 

Теперь, поскольку условие if было выполнено сначала Thread1, Thread1 будет conti NUE и выполнить следующую LOC, а

sharedInstance = [[MyClass alloc] init]; 

Теперь у вас есть 2 экземпляра MyClass созданных.

Таким образом, первый подход является лучшим. Он будет следить за тем, чтобы блок в пределах

dispatch_once(&onceToken, ^{ 

    }); 

Выполняется только один раз!

Однако, если вы ТОЛЬКО обращаетесь к Singleton через основную нить (поток пользовательского интерфейса), тогда также будет работать второй сценарий.

0

Использование dispatch_once() выполняется быстрее, и он выполняет что-то только один раз, поэтому, если вы дважды обращаетесь к нему из разных потоков, проблем не возникнет.

+0

Как 'dispatch_once' быстрее, чем' if'? это быстрее, чем '@ synchronized', да, но второй образец кода не имеет' @ synchronized'. – FreeNickname

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