2009-08-21 4 views
8

싱글 톤 클래스의 멤버를 초기화하는 가장 좋은 장소는 어디입니까?코코아 - 싱글 톤 객체 : 멤버 변수 초기화 위치?

저는 Apple 기본 가이드 싱글 톤 구현을 사용하고 있습니다. 당신은 inits가 어떤 라인에서 일어 났는지 정확하게 지적 해 주시겠습니까? 코드는 다음과 같다 :

static MyGizmoClass *sharedGizmoManager = nil; 

+ (MyGizmoClass*)sharedManager 
{ 
    @synchronized(self) { 
     if (sharedGizmoManager == nil) { 
      [[self alloc] init]; // assignment not done here 
     } 
    } 
    return sharedGizmoManager; 
} 

+ (id)allocWithZone:(NSZone *)zone 
{ 
    @synchronized(self) { 
     if (sharedGizmoManager == nil) { 
      sharedGizmoManager = [super allocWithZone:zone]; 
      return sharedGizmoManager; // assignment and return on first allocation 
     } 
    } 
    return nil; //on subsequent allocation attempts return nil 
} 

- (id)copyWithZone:(NSZone *)zone 
{ 
    return self; 
} 

- (id)retain 
{ 
    return self; 
} 

- (unsigned)retainCount 
{ 
    return UINT_MAX; //denotes an object that cannot be released 
} 

- (void)release 
{ 
    //do nothing 
} 

- (id)autorelease 
{ 
    return self; 
} 
+2

http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong을 읽고 싶을 수도 있습니다. 릴리스를 무시하는 싱글 톤을 정말로 원하십니까? 그냥 버그를 가린다. –

+0

그리고 Jon Hess가 Apple 문서를 따르고 있음을 상기시키기 전에 : Apple 문서에 대한 응답으로이 게시물을 작성했습니다. –

+0

또한 유의할 점은 클래스에는 모든 종류의 "멤버"가 없다는 것입니다. 얻을 수있는 가장 가까운 클래스의 구현 파일에 정적 변수입니다. 그리고 클래스 멤버는 초기화하려는 것이 아닙니다. 당신이 말하고자하는 것은 싱글 톤 * 인스턴스의 * 인스턴스 * 변수입니다. –

답변

18

그것은 일반적인 클래스와 마찬가지로입니다 - 블록 이상이 추가

-(id)init { 
    if (self = [super init]) { 
    // do init here 
    } 

    return self; 
} 

싱글은 처음 액세스 할 때 호출됩니다.

+0

내가 그 init 메서드를 만들면, 다음을 통과하지 않고 곧바로 접근 할 수 있습니다. sharedManager, 맞지? 이제 private로 만들면 init() 메서드를 오버라이드하지 않을 것입니다. 그렇습니까? –

+0

예, 직접 액세스 할 수 있지만 반드시 있어야한다고는 생각하지 않습니다. 싱글 톤은 필요할 때 처음 호출했는지 확인합니다. 평소와 같이 [[MySingletonClass sharedClass] 메시지]를 호출하면 ... – Rudi

+0

+1, Jon Hess가 언급했듯이이 객체의 인스턴스가 하나만 존재한다는 사실을 절대적으로 보장하지 않는 한 일반적으로 이러한 메소드를 모두 오버로드하지 않아야합니다. . 실제로는 거의 사용되지 않습니다. 일반적으로 공유 된 인스턴스에 쉽게 액세스 할 수있게하려는 경우 정적 인스턴스를 반환하는 + sharedInstance (또는 + sharedManager 등) 메소드를 구현하기 만하면되므로 호출자가 명시 적으로 고유 한 예. –

1

다른 클래스와 마찬가지로 init 메소드에서 초기화 할 수 있습니다.

그러나 싱글 톤에 구성원 상태가 포함되어 있으면 더 이상 스레드 안전하지 않을 수 있습니다. 싱글 톤은 언제든지 응용 프로그램의 어느 곳에서나 액세스 할 수 있으므로 다른 스레드에서 액세스 할 수 있습니다.