2012-05-14 4 views
1

Я пытаюсь понять причину, по которой dinpatch_once_t и _sharedObject не установлены на 0 и nil соответственно при повторных вызовах sharedInstance. Мне кажется, что так кодируется, что локальные переменные будут повторно инициализированы, так как вы можете сбросить статическое значение, верно? Какое основное из управления памятью ARC или iOS я не понимаю здесь?Singleton in iOS

+ (id)sharedInstance 
{ 
// structure used to test whether the block has completed or not 
static dispatch_once_t p = 0; 

// initialize sharedObject as nil (first call only) 
__strong static id _sharedObject = nil; 

// executes a block object once and only once for the lifetime of an application 
dispatch_once(&p, ^{ 
    _sharedObject = [[self alloc] init]; 
}); 

// returns the same object each time 
return _sharedObject; 
} 

ответ

7

Это на самом деле вещь C, а не ARC или iOS. Это «внутренняя статическая переменная» (локальная статическая переменная a.k.a.), и ее объявление обрабатывается только один раз. Он имеет локальную функцию, но имеет расширенный срок службы.