2013-04-15 4 views
1

См. Кусок кода, это метод класса. Может ли кто-нибудь дать мне некоторое объяснение этому методу? Что он сделал?Может ли кто-нибудь помочь мне понять этот кусок кода?

+ (PeriodicElements *)sharedPeriodicElements { 
    @synchronized(self) { 
    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; }); 
    } 
    return sharedPeriodicElementsInstance; 
} 
+1

кода чтобы сделать его потокобезопасным, и использовать диспетчер_собрания GCD. Поиск этих двух терминов :) –

+0

Спасибо Anoop Vaidya :) – chinabenjamin66

+1

Неверный код, чтобы сделать что-то потокобезопасным, при этом. Хотя это неправильно, оно работает. Но это ставит вопрос о качестве остальной базы кода. – bbum

ответ

3

Используется для создания синглета. dispatch_once будет убедиться, что независимо от того, сколько раз вы звоните sharedPeriodicElements, инициализатор будет вызываться только один раз на весь срок службы вашего приложения.

Блок synchronized немного преувеличен, хотя потому, что dispatch_once уже является потокобезопасным. Похоже, что вы смотрите на частично мутировавшую версию старого способа делать одиночка:

+ (PeriodicElements *)sharedInstance { 
    static PeriodicElements *sharedPeriodicElementsInstance; 
    @synchronized(self) { 
     if (sharedPeriodicElementsInstance == nil) { 
      sharedPeriodicElementsInstance = [[PeriodicElements alloc] init]; 
     } 
    } 
    return sharedPeriodicElementsInstance; 
} 

быть ясным (ТНХ @bbum), это действительно то, что вы должны быть запущены:

+(PeriodicElements *)sharedPeriodicElements { 
    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; }); 
    return sharedPeriodicElementsInstance; 
} 
+0

Да, я изучаю образец проекта, загруженный из центра iOS dev, спасибо mprivet – chinabenjamin66

+0

Чтобы быть понятным, шаблон 'dispatch_once' без @synchronized - тот, который нужно использовать. – bbum

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