왜 애플은 ARC에서 싱글톤 패턴을 구현하기 위해 dispatch_once를 사용할 것을 권장합니까?
ARC에서 싱글톤의 공유 인스턴스 접근자에서 dispatch_once를 사용하는 정확한 이유는 무엇입니까?
+ (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가 오브젝트를 작성하는데 크리스마스까지 시간이 걸린다면 어떻게 될까요?바로 돌아오는 건 아니죠?적어도 그것이 그랜드 센트럴 디스패치의 핵심인 것 같다.
그럼 왜 이런 짓을 하는 걸까요?
dispatch_once()
완전히 동기화되어 있습니다.모든 GCD 메서드가 비동기적으로 작업을 수행하는 것은 아닙니다(예:dispatch_sync()
동기하고 있습니다).의 사용dispatch_once()
는 다음 관용구를 대체합니다.
+ (MyClass *)sharedInstance {
static MyClass *sharedInstance = nil;
@synchronized(self) {
if (sharedInstance == nil) {
sharedInstance = [[MyClass alloc] init];
}
}
return sharedInstance;
}
의 이점dispatch_once()
더 빠르다는 거죠.또한 의미론적으로도 명확합니다.그것은 sharedInstance의 할당 초기화를 실행하는 여러 스레드로부터 보호할 수 있기 때문입니다.이러한 스레드가 모두 동시에 시행되는 경우입니다.두 개의 인스턴스를 생성할 수 없습니다.의 전체적인 생각dispatch_once()
'한 번, 한 번만'이라는 게 저희가 하고 있는 거예요
한 번밖에 안 돌아가니까.따라서 다른 스레드에서 두 번 액세스하면 문제가 발생하지 않습니다.
Mike Ash는 Care and Feeding of Singletons 블로그 투고에서 자세한 설명을 하고 있습니다.
모든 GCD 블록이 비동기적으로 실행되는 것은 아닙니다.
언급URL : https://stackoverflow.com/questions/9119042/why-does-apple-recommend-to-use-dispatch-once-for-implementing-the-singleton-pat
'programing' 카테고리의 다른 글
크래시 로그 Xcode는 어떻게 표시합니까? (0) | 2023.04.09 |
---|---|
어떻게 하면 삭제할 수 있습니다.DS_Git 저장소에서 파일을 저장하시겠습니까? (0) | 2023.04.09 |
Update 문에서 테이블 별칭을 사용하는 좋은 방법입니까? (0) | 2023.04.09 |
기본값 없이 null이 아닌 열을 추가할 수 있습니까? (0) | 2023.04.09 |
SQL Server 2008에서 선택한 쿼리 결과에서 테이블을 생성하는 방법 (0) | 2023.04.09 |