2014-03-13 3 views
1

내가 미리로드하고 내 오디오 파일 (sfx 및 음악 모두)에 액세스 할 때 사용하는 싱글 톤을 사용 중입니다. AppDelegate에서 [[FGAudio sharedInstance] preload];을 실행하기 시작했으나 사용하기 전에 미리로드를 기억해야한다는 걱정이있었습니다. 하나씩 일어나는 것. 내 질문은 것들을 자동으로 만드는 것입니다, 내 설정을하고 init에 미리로드 할 수있는 싱글 톤에 대한 방법에 액세스 할 수 있습니까, 아니면 것들이 여전히 시작되면서 init 메소드에 액세스하는 것이 현명하지 않습니까?init에서 self에 액세스하는 방법?

+ (FGAudio *)sharedInstance { 
    static FGAudio *sharedAudio = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedAudio = [[FGAudio alloc]init]; 
    }); 
    return sharedAudio; 
} 

.

- (id)init { 
    self = [super init]; 
    if(self) { 
     [self preload]; 
    } 
    return self; 
} 

답변

4
+ (FGAudio *)sharedInstance { 
    static FGAudio *sharedAudio = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedAudio = [[FGAudio alloc]init]; 
     [sharedAudio preload]; 
    }); 
    return sharedAudio; 
} 

나쁘지는 그 서브 클래스 것이다 그것을하거나시와 미래에 의존하는 개체가 엉망 당신은하지 않습니다 엉망 객체를 요구하여 미리로드 기간이 전화를 건 후에 입회해라. 예하 중. 위의 스 니펫을 사용하면 그 중 어떤 것에 대해서도 걱정할 필요가 없으며 미리로드 된 싱글 톤을 얻게됩니다.

+0

Joel, 내가 처음에 가지고 있었던 것이 사실이다. :) 이것이 없으면 미리로드되지 않은 싱글 톤을 생성 할 수 있다는 것을 알게되었다. 이것이 개인 코드이므로 그렇게 할 생각은 없지만 잘못 생각한 것입니다. 해명 해줘서 고마워. – fuzzygoat

+0

앞으로이 답변을 접할 수있는 사람을위한 부수적 인 말처럼 [FGAudio sharedInstance]도 추가했습니다. AppDelegate 메서드 응용 프로그램 : didFinishLaunchingWithOptions : 응용 프로그램이 시작될 때 단독 개체가 설정되고 미리로드되는지 확인합니다. – fuzzygoat

1

Calling a method from the init method?

"예. 그냥 매우 조심 (이전의 제한 사항을 준수하기 위해이 방법을 접근 사용하지 않아야합니다, 개체가 완전히 초기화되지 않았을 수 있습니다, 등등)"

당신이 보증되는 경우에 init의 방법을 참조하기 는
관련 문제