Почему Apple рекомендует использовать dispatch_once для реализации шаблона синглтона в ARC?

Какова точная причина использования dispatch_once в аксессоре общего экземпляра синглтона в ARC?

+ (MyClass *)sharedInstance
{
    //  Static local predicate must be initialized to 0
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

Разве это не плохая идея создать экземпляр синглтона асинхронно на заднем фоне? Я имею в виду, что произойдет, если я запрошу этот общий экземпляр и сразу же полагаюсь на него, но dispatch_once требуется до Рождества, чтобы создать мой объект? Он не возвращается сразу, верно? По крайней мере, в этом весь смысл Grand Central Dispatch.

Так почему они это делают?

303
задан Erik Godard 5 August 2017 в 10:10
поделиться