Итак, у меня есть синглтон, и я пытаюсь понять разницу между этими двумя реализациями: функционально я попытался запустить свой код с обоими из них, и они оба работаютРазница между этими двумя реализациями инициализаторов потоков в объекте C
Тем не менее, я заметил, что в первой реализации нет [self alloc], который вызывается вместо этого, для вызова [super alloc]. Я немного озадачен этим. Это, кажется, работает, но это кажется немного волшебно так Im интересно, если кто-то может прояснить
1-й способ:
+(id)getSingleton
{
static dispatch_once_t pred;
dispatch_once(&pred, ^{
locMgrSingleton = [[super alloc] init];
});
return locMgrSingleton;
}
Другой способ
+(id)getSingleton
{
@synchronized(self)
{
if (locMgrSingleton == nil)
{
locMgrSingleton = [[self alloc]init];
NSLog(@"Created a new locMgrSingleton");
}
else
{
NSLog(@"locMgrSingleton exists");
}
}
return locMgrSingleton;
}
Первый должен использовать 'self alloc'. – rmaddy
Вы спрашиваете о различиях в механизмах синхронизации или разнице между '[self alloc]' и '[super alloc]'? Для второго это может помочь: [Создание singleton с allocWithZone:] (http://stackoverflow.com/q/11962913) (при условии, что вы переопределили 'alloc', в любом случае). –