2

저는 iPhone 앱에서 작업 중이며 공유 싱글 톤 클래스에 문제가 있습니다. D 문제는 다음과 같다NSCoder를 사용하여 정적 싱글 톤 객체 초기화

, I로드 : 나는 두 변수 int gameRunsint totalScore이 'gamRuns 그냥 사용자가 응용 프로그램을로드 할 때마다 증가하고,'totalScore은 '분명를 저장하는 공유 싱글 톤을 사용하고 있습니다 싱글 앱 하중이 코드를 사용하여 내 자신의 방법을 사용하여 초기화하기 : 나도 같은 개체에 대한 포인터를 얻을 항상 다른 클래스에서이 클래스를 참조 할 수 있습니다으로이 큰 노력

+ (SingletonLevelState*)sharedLevelStateInstance { 

static SingletonLevelState *sharedLevelStateInstance; 

@synchronized(self) { 
    if(!sharedLevelStateInstance) { 
     //Init a singleton 
     sharedLevelStateInstance = [[SingletonLevelState alloc] init]; 
     sharedLevelStateInstance->gameRuns = 1; 
     sharedLevelStateInstance->totalScore = 0; 
    } 
} 
return sharedLevelStateInstance; 
} 

를, 그래서이 작품 다른 물체의 벌금 :

sharedLevelState = [SingletonLevelState sharedLevelStateInstance]; 
sharedLevelStateInstance.gameRuns++; 

(10)는 지금은 NSCoder 프로토콜을 추가하고, 다음과 같이 두 가지 방법 initWithCoderencodeWithCoder 추가 :

- (void) encodeWithCoder: (NSCoder *)coder 
{ 
    //encode level data 
    [coder encodeInt:self->gameRuns forKey:@"gameRuns"]; 
    [coder encodeInt:self->totalScore forKey:@"totalScore"]; 
} 
- (id) initWithCoder: (NSCoder *) coder 
{ 
    if(self = [super init]){ 
     self->gameRuns = [coder decodeIntForKey:@"gameRuns"]; 
     self->totalScore = [coder decodeIntForKey:@"totalScore"]; 
    } 
    return self; 
} 

을 이제 우리가 이미 저장된 물리게이있는 경우이 경우 응용 프로그램로드, 내가 확인할 때

//Load Level state 
sharedLevelStateInstance = [SingletonLevelState sharedLevelStateInstance]; 

//Check if file is saved 
NSFileManager *fm = [[NSFileManager alloc] init]; 
NSString *gameStatePath = [NSString stringWithString:[self getSavePath]]; 

if([fm fileExistsAtPath:gameStatePath]){ 
    [self loadState]; 
    sharedLevelStateInstance.gameRuns = sharedLevelStateInstance.gameRuns+1; 
    NSLog(@"Loaded %d times", [sharedLevelStateInstance gameRuns]); 
} 
[fm release]; 
: 내가 위에서 내 사용자 지정 방법을 사용하여 해당 클래스를 초기화하기하지 않으면 난 그냥 우리가 저장 한 상태를 파일로 그것을 인코딩의 기본값을 설정 한 후, 해당 파일과 클래스를 보관 해제, 존재, 여기에 코드입니다

이제 if 문에서 마지막 줄이 p로 작동합니다. 실수로, 그것은 예상대로 응용 프로그램을로드 할 때마다 증가하고 나는 정말로 행복하다고 느낀다. 권자. 나는 다음을 수행하여 다른 클래스의 단일의 참조를 얻을하려고 할 때

그러나, 문제가 발생 :

sharedLevelStateInstance = [SingletonLevelState sharedLevelStateInstance]; 
NSLog(@"Played: %d times", sharedLevelStateInstance.gameRuns); 

그것은 항상 다시 1로 계산, 내가 무슨 일을 알고 있지만 ' 내가 initWithCoder 싱글 톤 때, 그것을 해결하는 가장 좋은 방법은 고소하지 않습니다, 그것은 정적 객체를 반환하지 않습니다, 내가 내 sharedLevelStateInstance을 초기화 할 때 새로운 하나를 만듭니다, 그것은 하드 코드 된 기본값으로 초기화하는 첫 번째 사용자 지정 메서드를 호출합니다.

그래서 StackOverflow, 제발 도와주세요.!

나는 단지 initWithCoder 때마다 새 개체를 할당하지 않고 같은 개체에 대한 참조를 얻는 가장 좋은 방법이 무엇인지 알아야합니다!

감사합니다 :)

답변

2

그래서, 당신은 코드 아마 다음과 같아야합니다

싱글의 변수를 설정하고, 싱글을 반환
if(self = [[SingletonLevelState sharedLevelStateInstance] retain]) 

. 싱글 톤을 유지하여 NSCoder이이 인스턴스를 릴리스 할 때 싱글 톤을 완전히 할당 취소하지 않도록하십시오.

+0

Ahhh 완벽, 당신은 단지 내 하루를 저장했습니다 :) –

+0

@ MostafaTorbjørnBerg 아무 문제가, 그냥 답변을 수락 기억 : –

+0

완료 :) 다시 한번 감사드립니다! –

관련 문제