singletonInstance
변수 는 세트 nil
까지입니다,하지만이 static
범위를 가지고 있기 때문에 (이 한 번만 nil
로 설정되어 있지마다 (즉, 그것은이 방법 내에서만 접근 가능하도록 글로벌처럼 동작) 이 메소드가 호출 될 때). 따라서 singletonInstance
이 dispatch_once
블록 안에있는이 클래스의 특정 인스턴스로 설정되면 변수가 나중에 nil
으로 재설정되지 않을 수 있습니다.
dispatch_once
호출은 코드 블록이 한 번만 호출되고 (static
변수 인, onceToken
) 호출 코드가 아직 호출되었는지 여부를 추적하는 방법입니다. dispatch_once
패턴의 이점은 다른 접근 방식과는 달리 스레드로부터 안전하다는 것입니다. 따라서 다중 스레드가 singletonInstance
을 동시에 호출하려고해도 경합 조건을 피하면서 정확하게 한 번만 호출됩니다.
여기서 일반적인 스레드는 변수 선언에 static
키워드를 사용하는 것입니다. static
한정자는 변수가 특정 메소드에 고유 한 로컬 변수가 아니며 클래스의 특정 인스턴스에 고유 한 인스턴스 변수도 아니도록 지정합니다. 이 singletonInstance
메소드에 대한 모든 호출간에 효과적으로 공유되는 변수입니다 (또는 적어도 앱이 종료 될 때까지). 따라서 static
변수는 단일 참조를 추적하는 효과적인 메커니즘이며 dispatch_once
이 호출되었는지 여부를 추적하는 데 사용할 수있는 좋은 참조입니다.
출처
2014-11-20 23:15:43
Rob