【Xcode】データをアプリ内に保存するためのメモ1(変数編)

【Xcode5.1.1 + iOS 7.1 + MacOX10.9.4】

設定などのデータ(変数など)をアプリ内に保存するには、NSUserDefaultsを使うといいらしい。

iPhoneアプリ開発の虎の巻 NSUserDefaults
A Day In The Life NSUserDefaults を使ったデータの保存方法

で、load,saveの際に呼び出す関数を書いてみた。

//アイコン関連情報:読み込み
-(void)loadData
{
    defaults = [NSUserDefaults standardUserDefaults];

    //アイコン画像配列
    NSArray *array = [defaults arrayForKey:@"icon"];
    if (array) {
        //既存値を使用
        array_icon = [array mutableCopy];

    } else {
        //配列を新規に作成
        array_icon = [NSMutableArray arrayWithObjects:@"icon_250.jpg", @"miku_250.jpg", @"logo_2tones_250.jpg",@"shugo_250.jpg", nil];

    }

    //アイコン選択番号
    int num = (int)[defaults integerForKey:@"selectNum"];
    if (num) {
        //既存値を使用
        select_num = (long)num;
    } else {
        //初期値を設定
        select_num = 0;
    }

}

//アイコン関連情報:保存
-(void)saveData
{
    //配列:設定
    NSArray *array = [array_icon copy];
    [defaults setObject:array forKey:@"icon"];

    //番号:設定
    int num = (int)select_num;
    [defaults setInteger:num forKey:@"selectNum"];

    //更新
    BOOL successful = [defaults synchronize];
    if (successful) {
        NSLog(@"%@", @"データの保存に成功しました。");
    }
}

loadDataは、viewDidLoadで、saveDataはデータに変更があったタイミングで呼び出しています。

上のコードでの注意点

1.アプリではNSMutableArray(可変配列)を使っているのだけれど、NSUserDefaultsにはNSArray(固定配列)しか保存できないので、ロード/セーブ時に配列をキャストしてやる必要がある、ということです。

iPhoneアプリ開発メモ NSArrayはNSMutableArrayにキャスト可能か?

2.データ保存の際は、明示的に synchronize で更新しないと保存タイミングがOS任せになるらしいです。

iPhoneアプリ開発者の憂鬱 NSUserDefaultsの保存処理でハマった

3.実際にNSUserDefaultsはどこに保存されるのか?テスト等での確認に。

iPhoneアプリ開発者の為のAndroidアプリ開発のポイント(現忘備録) [iOS]NSUserDefaultsの保存先・実機のデータを見る方法