저는 iPhone 앱에서 작업 중이며 공유 싱글 톤 클래스에 문제가 있습니다. D 문제는 다음과 같다NSCoder를 사용하여 정적 싱글 톤 객체 초기화
, I로드 : 나는 두 변수 int gameRuns
및 int 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 프로토콜을 추가하고, 다음과 같이 두 가지 방법 initWithCoder
및 encodeWithCoder
추가 :
- (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
때마다 새 개체를 할당하지 않고 같은 개체에 대한 참조를 얻는 가장 좋은 방법이 무엇인지 알아야합니다!
감사합니다 :)
Ahhh 완벽, 당신은 단지 내 하루를 저장했습니다 :) –
@ MostafaTorbjørnBerg 아무 문제가, 그냥 답변을 수락 기억 : –
완료 :) 다시 한번 감사드립니다! –