夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Objective-C】NSUserDefaultsに値を書き込んだらsynchronizeをすべきなのか?

音量調節ボタンやミュートボタンをアプリに追加しました。

ゲーム実行時画面には音量調節とミュートのON/OFFボタン、タイトル画面にはミュートのON/OFFボタンを配置して早速テストしてみると、ゲーム内でミュートしたはずなのに再起動後のタイトル画面ではミュートが外れていたり、音量調節しても再起動後に元に戻っていたりと意味不明の動作となっていました。

調節した音量やミュート状態はゲーム終了後も保持し、次回起動時に引き継ぐためNSUserDefaultsに保存していたのですが、これでは使い物になりません。

調べてみると、NSUserDefaultsに値を描き込んだ後、synchronizeしないと必ずしも即時値がセーブされないとのことでした。

これはボリュームを下げる処理なのですが、setInteger:forkey:メソッドの直後にsynchronizeメソッドを呼ぶようにしました。

- (void)volumeDown
{
    NSInteger volume = [[NSUserDefaults standardUserDefaults] integerForKey:@"volume"];
    volume--;
    if (volume < 0) {
        volume = 0;
    }
    [[NSUserDefaults standardUserDefaults] setInteger:volume forKey:@"volume"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self adjustVolume:volume];
}

これにより、設定した値が即座にファイルに反映されるようになり、前述の矛盾は発生しなくなりました。
synchronizeをしない場合、実際にファイルに書き込まれるまでの遅延がどれほどかは不明ですが、念のため自分で明示的にsynchronizeしておいた方がいいんでしょうね。
https://itunes.apple.com/jp/app/travelshooting-jp-toraberushutingu/id917570972?mt=8&uo=4&at=10laCt