2013-02-14 8 views
3

그래서 싱글 톤과 임 두 사람 구현의 차이점을 이해하려고 노력하고 있습니다. 기능적으로 두 코드 모두 실행하려고 시도했지만 모두 작동합니다.객관적인 C에서 스레드 안전 이니셜 라이저의 두 구현 사이의 차이

그러나 첫 번째 구현에서는 [자체 할당]이 호출되지 않고 [슈퍼 할당]이 호출됨을 알았습니다. 이것으로 조금은 당황 스럽네요. 작동하는 것 같다하지만 누군가가

첫번째 방법으로 명확하게 할 수있는 경우 임 궁금 그래서 조금 마법 보인다 [super alloc][self alloc] 클래스하지 않는 한 차이가 없습니다 사용

+(id)getSingleton 
{ 

    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ 
    locMgrSingleton = [[super alloc] init]; 

     }); 

    return locMgrSingleton; 

} 

또 다른 방법

+(id)getSingleton 
{ 
    @synchronized(self) 
    { 
     if (locMgrSingleton == nil) 
     { 
      locMgrSingleton = [[self alloc]init]; 
      NSLog(@"Created a new locMgrSingleton"); 
     } 
     else 
     { 
      NSLog(@"locMgrSingleton exists"); 
     } 

    } 

    return locMgrSingleton; 
} 
+0

첫 번째 것은'self alloc'을 사용해야합니다. – rmaddy

+0

동기화 메커니즘의 차이점이나'[self alloc]'과'[super alloc] '의 차이점에 대해 묻고 있습니까? 두 번째로, 이것은 도움이 될 수 있습니다 : (allocWithZone :와 싱글 톤 만들기 (http://stackoverflow.com/q/11962913) (여러분이'alloc'을 오버라이드했다고 가정 할 때). –

답변

4

을 또한 +alloc을 무시합니다. 즉, [self alloc]으로 전화해야합니다. 이것은 아마도 을 호출 할 것입니다. 왜냐하면 이것은 아마도 +alloc을 오버라이드 (override) 한 구현에서 조정되어 싱글 톤을 반환했기 때문입니다. 어떤 경우

는 두 패턴의 차이는 superself 외에 this other question에 내 대답에 설명되어 있지만, 짧은에, dispatch_once()이 작업을 수행 할 수있는 현대적인 방법입니다. 그것은 @synchronized보다 빠르며 더 의미 론적 의미를 지닙니다.

1

http://cocoasamurai.blogspot.fi/2011/04/singletons-your-doing-them-wrong.html이면 dispatch_once 전화는 단순히 @synchronized(self)보다 다소 빠른 것 같습니다.

[self alloc] 대신 [super alloc]이 표시되는 이유는 구체적으로 dispatch_once 버전에만 적용되는 이유는 없지만 다른 이유는 없습니다. 정적 메서드에서 self은 단순히 클래스 자체 (그리고 직접 슈퍼 클래스에 대한 super)를 참조하기 때문에 실제 클래스 이름을 쓰는 것만 큼 간단하게 표시합니다.

필자는 어쨌든 달리 수퍼 클래스가 아닌 현재 클래스의 이름을 작성 했으므로 [self alloc]을 사용했습니다. [super alloc]을 특별히 호출하는 것이 어떤 특별한 의미를 지는지는 알 수 없습니다.

1

클래스 메서드에서 self은 클래스 자체를 가리 킵니다. 두 가지 구현에서 [self alloc], [MySingleton alloc][super alloc]은 모두 의미 상 동일합니다. 이상한 이유가없는 한 +alloc을 재정의하십시오.

+(instancetype) alloc __attribute__((unavailable("alloc not available")));

또는

+(instancetype) alloc NS_UNAVAILABLE;

그렇지 않은 : 당신이 명시 적으로 컴파일러 지시문을 사용하여 선언 +alloc 사용할 수없는 표시 할 때 다른 사람을 통해 [super alloc]을 사용할 수 있습니다

한 이유는 컴파일러는 싱글 톤 클래스의 인스턴스 인 +alloc을 시도 할 때 오류를 발생시킵니다. nt를 제외하고는 dispatch_once에서 공유 싱글 톤 인스턴스 +alloc.

관련 문제