2

私はiPhoneアプリケーションで作業しており、共有シングルトンクラスでいくつかの問題に直面しています。 私は2つの変数 int gameRunsint totalScore を格納するための共有シングルトンを使用している「gamRunsただ、ユーザーがアプリをロードするたびに増加し、「totalScore」は明白です:次のようにDNSCoderでスタティックシングルトンオブジェクトを初期化する

は、問題は、私はロードであり、シングルトンと、このコードを使用するときにアプリがロード私自身の方法を使用してINIT:

+ (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++; 

は、今私は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にカウントし、私は何が起こるか知っているが、私は」私がsharedLevelStateInstanceを初期化するときに、静的オブジェクトを返さず、新しいオブジェクトを返します。これは、最初のカスタムメソッドを呼び出し、デフォルトにハードコードされて初期化されます。

だからStackOverflow、お手伝いできますか?

私はちょうどinitWithCoderのたびに新しいオブジェクトを割り当てることなく、同じオブジェクトへの参照を取得する最良の方法を知る必要があります!

感謝:)

答えて

2

だから、あなたはコードおそらく次のようになります。

シングルトンの変数を設定し、シングルトンを返し
if(self = [[SingletonLevelState sharedLevelStateInstance] retain]) 

。シングルトンを保持するようにしてください。NSCoderがこのインスタンスを解放すると、シングルトンは完全に解放されません。

+0

Ahhh完璧な、私の一日を保存しました:) –

+0

@MostafaTorbjørnBergいいえ、問題を解決してください: –

+0

完了:もう一度ありがとう! –

関連する問題