Для синхронизации создания Singleton вы должны использовать класс singleton как объект для синхронизации. Это моя обычная картина:
+(MyObject*) singleton
{
static MyObject* singleton = nil;
@synchronized([MyObject class])
{
if(singleton == nil)
{
singleton = [[MyObject alloc] init];
}
}
return singleton;
}
Очки отметить:
Я сделал это метод класса. Фактически вам это не нужно, это будет работать как метод экземпляра.
Обычно в методах класса при обращении к классу вы должны использовать self
(или [self class]
в методах экземпляра). Однако это было бы неправильно, потому что подклассы синхронизировали использование другого объекта с классом MyObject.
Я положил обратную связь за пределы блока @synchronize
. Вполне нормально возвращаться изнутри блока, но если вы это сделаете, вы получите предупреждение ложного статического анализатора, говорящее, что метод может не вернуть значение.
Редактировать
выше картина давно устарели. Это лучше всего использовать dispatch_once
рисунка на
+(MyObject*) singleton
{
static dispatch_once_t onceToken;
static MyObject* singleton = nil;
dispatch_once (&onceToken, ^{
singleton = [[MyObject alloc] init];
});
return singleton;
}
дубликата http://stackoverflow.com/questions/1215330/how-does-synchronized-lock-unlock-in-objective-c –
Не совсем дубликат, связанный с этим вопрос конечно. –