2014-11-20 1 views
0

singletonInstance가 nil로 설정되지 않은 이유와 dispatch_one이 onceToken과 함께 작동하는 이유에 대한 낮은 수준의 설명을 줄 수 있습니까?로우 레벨 싱글 톤 인스턴스

+ (id)singletonInstance { 
    static FOO *singletonInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     singletonInstance = [[self alloc] init]; 
    }); 
    return singletonInstance; 
} 

답변

0

singletonInstance 변수 세트 nil까지입니다,하지만이 static 범위를 가지고 있기 때문에 (이 한 번만 nil로 설정되어 있지마다 (즉, 그것은이 방법 내에서만 접근 가능하도록 글로벌처럼 동작) 이 메소드가 호출 될 때). 따라서 singletonInstancedispatch_once 블록 안에있는이 클래스의 특정 인스턴스로 설정되면 변수가 나중에 nil으로 재설정되지 않을 수 있습니다.

dispatch_once 호출은 코드 블록이 한 번만 호출되고 (static 변수 인, onceToken) 호출 코드가 아직 호출되었는지 여부를 추적하는 방법입니다. dispatch_once 패턴의 이점은 다른 접근 방식과는 달리 스레드로부터 안전하다는 것입니다. 따라서 다중 스레드가 singletonInstance을 동시에 호출하려고해도 경합 조건을 피하면서 정확하게 한 번만 호출됩니다.

여기서 일반적인 스레드는 변수 선언에 static 키워드를 사용하는 것입니다. static 한정자는 변수가 특정 메소드에 고유 한 로컬 변수가 아니며 클래스의 특정 인스턴스에 고유 한 인스턴스 변수도 아니도록 지정합니다. 이 singletonInstance 메소드에 대한 모든 호출간에 효과적으로 공유되는 변수입니다 (또는 적어도 앱이 종료 될 때까지). 따라서 static 변수는 단일 참조를 추적하는 효과적인 메커니즘이며 dispatch_once이 호출되었는지 여부를 추적하는 데 사용할 수있는 좋은 참조입니다.