[iOS][Obj-C] NSUserDefaults カンタン使用法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NSUserDefaults カンタン使用法

NSUserDefaults は、小規模なデータを保存するのにベンリですね。しかしながら、いささか記述が長いので、繰り返し様々なところで使う場合、ちょっとだるいかもしれません。

そこで今回は、NSUserDefaults を扱う Helper クラスを作成し、短い&見やすい&書きやすい記述でデータ保存を行う方法を扱います。

Helperクラスを作成

まず最初に一手間かけます。データ保存のための Helper クラスを作成します。今回は、以下のクラスが登場します。

  • ViewController クラス(プロジェクト生成時に自動的に作成されたものを利用)
  • DataSaveHelper クラス

まずは DataSaveHelper クラスから見て行きましょう。

ヘッダファイル

DataSaveHelper.h

#import "Foundation/Foundation.h"
@interface DataSaveHelper : NSObject
@property (nonatomic) BOOL initialized;
@property (nonatomic) NSInteger howManyTimesAppLaunched;
@end

セーブするデータは以下の2種類です。それぞれプロパティとして定義しています。

  • 初回起動時の初期化が済んだかを表す Bool 型の initialized
  • 起動回数を表す NSInteger 型の howManyTimesAppLaunched

実装ファイル

実装ファイルでは、プロパティにより生成されたゲッタ・セッタをオーバーライドしています。永続化領域から値を読み込んで返したり、永続化領域に値を書き込んだりしています。

DataSaveHelper.m

#import "DataSaveHelper.h"
static NSString *const kKeyInitialized = @"initialized";
static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched";

@implementation DataSaveHelper

- (BOOL)initialized
{
    return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized];
}

- (void)setInitialized:(BOOL)initialized
{
    [[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized];
}

- (NSInteger)howManyTimesAppLaunched
{
    return [[NSUserDefaults standardUserDefaults] integerForKey:kKeyHowManyTimesAppLaunched];
}

- (void)setHowManyTimesAppLaunched:(NSInteger)howManyTimesAppLaunched
{
    [[NSUserDefaults standardUserDefaults] setInteger:howManyTimesAppLaunched forKey:kKeyHowManyTimesAppLaunched];
}

具体的に見て行きましょう。

キーの名前を予め定数として指定

static NSString *const kKeyInitialized = @"initialized";
static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched";

このように定義しておくことで、補完が聞きますし、キー名のミスタイプも防げますね。

ゲッタ

- (BOOL)initialized
{
    return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized];
}

キーを指定して、値を取得後、値を返しています。

セッタ

- (void)setInitialized:(BOOL)initialized
{
    [[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized];
}

キーを指定して、値を永続化領域に書き込んでいます。

title

上記セッタであれば、- (void)setInit あたりまで入力した時点で、 - (void)setInitialized:(BOOL)initialized まで補完してくれるでしょう。スラスラかけて、楽しいですね。

ViewController

ViewController.m

#import "ViewController.h"
#import "DataSaveHelper.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    DataSaveHelper *helper = [DataSaveHelper new];
    
    if (helper.initialized) {
        NSLog(@"初回起動時の初期化は済んでいます");
    } else {
        helper.initialized = YES;
        // 初回起動時の初期化処理など
    }
    
    helper.howManyTimesAppLaunched ++;
    
    NSLog(@"%ld", helper.howManyTimesAppLaunched);
}

今回は Helper クラスの動作確認が目的ですので、viewDidLoadに直接書き込んでいきます。

上記では、DataSaveHelper クラスのインスタンスを生成し、ドット記法でゲッタ・セッタにアクセスし、値をセーブ・取得しています。

initialized を見て、もし初期化されていなかったら初期化処理をし、そうでなかったら、ログだけ出力。

その後、
viewDidLoad が呼ばれた回数 = 起動回数
と見做し、howManyTimesAppLaunched の値をインクリメント。起動回数をNSLogで出力しています。

VCAutoCompletion

こんなふうに、補完が効くので、データセーブ箇所で毎回 NSUserDefaults クラスやキー名の記述をするより、間違いが少なくなりますし、スラスラかけてコーディングが楽しくなりますね!

この手法は広く知られているとは思うのですが、まだ試されていない方は是非!