キーの値を変更しようとするまで有効な userDefault bool キーを作成しています。キーの値を変更したら、キーがアプリケーション バンドルから消えたようです。たとえば、次のコードは GameManager (ゲーム アプリのすべてのレベルを提供するシングルトン) の init ルーチンにあり、アプリが最初に読み込まれたときに実行されます。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // get the shared defaults object
if (defaults) {
if ([defaults boolForKey:@"Sound Effects ON"]) {
isSoundEffectsON = [defaults boolForKey:@"Sound Effects ON"];
}
else {
[defaults setBool: YES forKey:@"Sound Effects ON"];
isSoundEffectsON = YES;
[defaults synchronize]; // save the initial state
}
}
このコードが最初に入力されたとき、@"Sound Effects ON" の userDefault が現在存在しないため、実行パスは else 句を使用します。@"Sound Effects ON" に対して他に何もせずにアプリを再起動すると (したがって、このコードを再入力します)、実行パスは if 句を取り、@"Sound Effects ON" の格納された値を取得します (これは、キーが有効になったことを示します)。アプリケーション バンドルに正常に保存されます)。
後で、ゲーム レベルの 1 つが実行されているときに、ユーザーがこのキーの値を変更することを決定すると、次のコードが実行されます。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // get the shared defaults object
if ([[GameManager sharedGameManager] isSoundEffectsON]) {
[[GameManager sharedGameManager] setIsSoundEffectsON:NO];
if (defaults) {
// Update the state for sound effects
[defaults setBool: NO forKey:@"Sound Effects ON"];
[defaults synchronize]; // save the current state
}
} else {
[[GameManager sharedGameManager] setIsSoundEffectsON:YES];
if (defaults) {
// Update the state for sound effects
[defaults setBool: YES forKey:@"Sound Effects ON"];
[defaults synchronize]; // save the current state
}
}
isSoundEffects が以前にオンであった場合、@"Sound Effects ON" bool が NO に設定され、userDefault が同期されます (おそらく値を保存するため)。この実行パスが使用されると、このキーの userDefault がアプリケーション バンドルから削除されたように見えます。アプリがリロードされ、GameManager init のコードが再度実行されると、else 句が実行され、@"Sound Effects ON" の userDefault キーがないことが示されるためです。
私は何が欠けていますか?このキーが消えているのはなぜですか?