Objective-CでのNSUserDefaultsの完璧な使い方12ステップ

Objective-CでのNSUserDefaultsの使い方を学ぶイラストObjctive-C
この記事は約16分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Objective-Cという名前を耳にしたことがある方も多いかと思います。

特にAppleのiOSやmacOSのアプリケーション開発をしている方には馴染み深い言語です。

そして、Objective-Cを使用する上で避けて通れないのが、データの永続化を実現するためのNSUserDefaultsです。

この記事では、Objective-Cを使用してNSUserDefaultsを効果的に使う12のステップを詳細に解説していきます。

初心者から上級者まで、この記事を通してNSUserDefaultsの利用方法をしっかりと身につけることができるでしょう。

●Objective-Cとは

Objective-Cは、C言語をベースに、Smalltalkのオブジェクト指向機能を組み込んだプログラミング言語です。

AppleのiOSやmacOSのアプリケーション開発で広く用いられており、Swiftの登場以前は主要な開発言語でした。

Objective-Cは、メッセージベースのオブジェクト指向機能を持つことから、コードの可読性や保守性が高いと評価されています。

○Objective-Cの基本的な特徴

Objective-Cの特徴として、次の点が挙げられます。

  1. 動的型付け:変数のデータ型をコンパイル時ではなく、実行時に決定することができるため、柔軟なプログラミングが可能です。
  2. メッセージ送信:オブジェクト間のコミュニケーションはメッセージ送信という形で行われます。これにより、コードの可読性が向上します。
  3. カテゴリ:既存のクラスに新しいメソッドを追加することができる機能です。これにより、既存のコードの変更なしに機能拡張が可能となります。
  4. プロトコル:インターフェースの宣言のみを行うことができる機能で、JavaのインターフェースやSwiftのプロトコルと似た概念です。複数のクラスで共通のインターフェースを持つことができます。

Objective-Cのこれらの特徴は、アプリケーション開発において非常に役立ちます。

特にデータの永続化に関しては、NSUserDefaultsという強力なツールと組み合わせることで、さらに効果的な開発が可能となります。

●NSUserDefaultsとは

NSUserDefaultsは、Appleが提供するObjective-C向けの軽量なデータ保存ソリューションです。

これを使用すると、アプリケーションのユーザープリファレンスや設定を持続的に保存し、後で取得できるようになります。

具体的には、文字列や数値、ブール値などの基本的なデータ型を保存するのに適しています。

このNSUserDefaultsは、アプリが終了または再起動された後でも、データが消えることはありません。

よって、ユーザーの設定や進行状況を持続的に記録するのに役立ちます。

○NSUserDefaultsの主な用途

  • ユーザー設定の保存:ユーザーの言語選択、テーマ、フォントサイズなどの設定を保存して、次回起動時にも反映されるようにします。
  • 進行状況の記録:ゲームやチュートリアルの進行状況を記録し、再度アプリを開始した際に続きから始めることができます。
  • 一時的なデータの保存:ユーザーが入力した情報や、最後に開いたページなどの一時的なデータを保存し、アプリの使い勝手を向上させます。

○NSUserDefaultsの利点

NSUserDefaultsの利点としては、次の点が挙げられます。

  1. 簡単な導入:特別なデータベースや外部ライブラリを導入する必要がなく、Appleが提供するフレームワーク内で完結します。
  2. 高速なアクセス:NSUserDefaultsは、内部的にはプロパティリストファイルとしてデータを保存するため、読み書きが高速です。
  3. 安全性:保存されるデータは、アプリ専用の領域に格納されるため、他のアプリからアクセスされることはありません。
  4. 持続性:ユーザーがアプリを削除しない限り、保存したデータは持続的にアクセス可能です。これにより、アプリの使用履歴や設定などを保持するのに適しています。

●NSUserDefaultsの基本的な使い方

NSUserDefaultsは、iOSアプリの設定やデータの一時保存に非常に役立つクラスです。

これは、ユーザの設定やアプリの状態を簡単に保存・取得するための方法として用いられます。

基本的な使い方から順を追って解説します。

○サンプルコード1:データを保存する

このコードでは、NSUserDefaultsを使って文字列のデータを保存するコードを表しています。

この例では、”userName”というキーで”John Doe”という文字列を保存しています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"John Doe" forKey:@"userName"];
[defaults synchronize];

このコードを実行すると、”userName”というキーで”John Doe”という文字列が保存されます。

synchronizeメソッドは、NSUserDefaultsに変更が加えられた後、それをディスクに即座に保存するために呼び出されます。

○サンプルコード2:データを取得する

このコードでは、保存されたデータをNSUserDefaultsから取得するコードを表しています。

この例では、先ほど保存した”userName”というキーで保存されているデータを取得しています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *userName = [defaults stringForKey:@"userName"];
NSLog(@"%@", userName);

上記のコードを実行すると、コンソールに”John Doe”という文字列が表示されます。

このようにしてNSUserDefaultsから保存されたデータを簡単に取得することができます。

○サンプルコード3:データを削除する

このコードでは、NSUserDefaultsから特定のデータを削除するコードを表しています。

この例では、”userName”というキーで保存されているデータを削除しています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"userName"];
[defaults synchronize];

上記のコードを実行すると、”userName”というキーで保存されていたデータは削除されます。

次にそのキーでデータを取得しようとしても、何も返ってこないことを確認できます。

●NSUserDefaultsの応用例

NSUserDefaultsは、Objective-CでiOSアプリケーションのユーザー設定やデータの保存に利用される非常に便利なツールです。

しかし、基本的なデータの保存・取得・削除だけでなく、多彩な応用例が存在します。

ここでは、実際によく使用される応用例としてのサンプルコードをご紹介します。

○サンプルコード4:ユーザー設定の保存と取得

このコードでは、アプリケーションのユーザー設定を保存し、それを後で取得する方法を表しています。

この例では、ユーザー名とユーザーの年齢を保存し、取得しています。

// ユーザー設定を保存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"山田太郎" forKey:@"userName"];
[defaults setInteger:25 forKey:@"userAge"];
[defaults synchronize];

// ユーザー設定を取得
NSString *userName = [defaults objectForKey:@"userName"];
NSInteger userAge = [defaults integerForKey:@"userAge"];

このコードを実行すると、”山田太郎”というユーザー名と25という年齢がNSUserDefaultsに保存されます。

そして、それを取得することができ、変数userNameとuserAgeにそれぞれの値が代入されます。

○サンプルコード5:色の設定を保存と取得

アプリケーションのカスタムテーマなどで、特定の色を保存し取得する際に役立ちます。

このコードではUIColorをNSDataとして保存し、再度UIColorとして取得する方法を表しています。

// 色をNSDataとして保存
UIColor *color = [UIColor colorWithRed:0.5 green:0.6 blue:0.7 alpha:1.0];
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:colorData forKey:@"themeColor"];
[defaults synchronize];

// NSDataから色を取得
NSData *savedColorData = [defaults objectForKey:@"themeColor"];
UIColor *savedColor = [NSKeyedUnarchiver unarchiveObjectWithData:savedColorData];

このコードを使用することで、任意のUIColorを保存し、後からその色を再度取得することができます。

○サンプルコード6:アラートの表示設定を保存と取得

ユーザーの選択に基づいてアラートの表示を制御する際に使用します。

このコードでは、アラートの表示設定をBOOL値として保存し、取得する方法を表しています。

// アラートの表示設定を保存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"showAlert"];
[defaults synchronize];

// アラートの表示設定を取得
BOOL showAlert = [defaults boolForKey:@"showAlert"];
if (showAlert) {
    // アラートを表示する処理
}

このコードを使用すると、アラートの表示設定を保存し、後からその設定に基づいてアラートの表示を制御することができます。

●注意点と対処法

NSUserDefaultsを利用する際、注意するべきポイントと、それらの問題に対する解決策について詳しく解説していきます。

○データの上書きに関する注意点

NSUserDefaultsは、アプリ内で保存する小さなデータのためのものですが、誤って既存のデータを上書きしてしまう可能性があります。

特に同じキーを使用してデータを保存する場合、上書きのリスクが高まります。

上書きを避けるためには、保存する前に既存のデータがあるかどうかを確認することが重要です。

□サンプルコード7:データの上書きを避ける方法

下記のサンプルコードでは、NSUserDefaultsに特定のキーでデータがすでに保存されているかどうかを確認し、存在しない場合のみ新しいデータを保存しています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"myKey"]) {
    [defaults setObject:@"新しいデータ" forKey:@"myKey"];
    [defaults synchronize];
}

このコードではNSUserDefaultsを使って”myKey”というキーのデータを確認しています。

この例では”myKey”に関連するデータが存在しない場合、”新しいデータ”を保存しています。

このように、すでにデータが保存されている場合は上書きを避け、新しいデータを保存することができます。

○データの型に関する注意点

NSUserDefaultsに保存するデータは、基本的にはNSObjectのサブクラスのみが許容されます。

したがって、保存しようとするデータの型が適切かどうかを確認することが重要です。

例えば、NSIntegerやCGFloatなどの基本的なデータ型は直接保存することはできません。

これらの型のデータを保存する場合は、NSNumberなどの適切なオブジェクト型に変換する必要があります。

□サンプルコード8:型の違いを確認する方法

下記のサンプルコードでは、整数型のデータをNSNumberに変換してからNSUserDefaultsに保存する方法を表しています。

NSInteger myInteger = 123;
NSNumber *number = [NSNumber numberWithInteger:myInteger];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:number forKey:@"integerKey"];
[defaults synchronize];

このコードでは、NSInteger型のmyIntegerをNSNumber型に変換しています。

この例では123という整数を”integerKey”というキーで保存しています。

この方法を利用すれば、基本的なデータ型もNSUserDefaultsに保存することができます。

但し、変換の手間がかかるため、保存するデータの型を事前によく確認し、必要に応じて適切な型に変換することが重要です。

●カスタマイズ方法

NSUserDefaultsを使ってデータの保存や取得を行う際に、さらにカスタマイズして効率よく使う方法について説明します。

下記のサンプルコードは、UserDefaultsを更に使いやすくするためのカスタマイズ例となります。

○サンプルコード9:カスタムクラスを使用してデータを保存

このコードでは、カスタムクラスを利用してデータを保存する方法を表しています。

この例では、Userというカスタムクラスを作成し、そのインスタンスを保存しています。

// Userクラスの定義
@interface User : NSObject <NSCoding>
@property (strong, nonatomic) NSString *name;
@property NSInteger age;
@end

@implementation User

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self) {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.age = [decoder decodeIntegerForKey:@"age"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeInteger:self.age forKey:@"age"];
}
@end

// カスタムクラスのインスタンスを保存
User *user = [[User alloc] init];
user.name = @"Taro";
user.age = 25;

NSData *userData = [NSKeyedArchiver archivedDataWithRootObject:user];
[[NSUserDefaults standardUserDefaults] setObject:userData forKey:@"user"];

上のコードでは、UserクラスがNSCodingプロトコルを採用しているので、そのインスタンスをNSDataに変換してUserDefaultsに保存することができます。

実際にこのコードを実行すると、UserDefaultsにUserクラスのインスタンスがNSDataとして保存されます。

○サンプルコード10:同期のカスタマイズ

このコードでは、NSUserDefaultsのデータ同期タイミングをカスタマイズする方法を表しています。

デフォルトではアプリがバックグラウンドに移行する際やシステムが適切と判断したタイミングでデータが同期されますが、手動で同期を行いたい場合には次のようにします。

[[NSUserDefaults standardUserDefaults] setObject:@"value" forKey:@"key"];
// 手動でデータの同期を行う
[[NSUserDefaults standardUserDefaults] synchronize];

このコードの実行により、明示的にデータの同期が行われます。

○サンプルコード11:容量の節約方法

UserDefaultsは簡易的なデータの保存に適していますが、大量のデータや頻繁に変更されるデータの保存には向いていません。

そのため、容量の節約や効率的な利用のためのカスタマイズ例を紹介します。

// 保存するデータのサイズを確認
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"largeDataKey"];
if (data.length > 100000) {  // 100KB以上の場合
    // 他の方法での保存を検討
}

このコードでは、保存するデータのサイズを確認して、ある一定のサイズ以上の場合は他の保存方法を検討するようにしています。

○サンプルコード12:バックアップの除外設定

アプリ内で生成されたキャッシュデータや一時的なデータは、デバイスのバックアップ時には不要な場合が多いです。

そのようなデータをバックアップの対象から除外する方法を示します。

NSURL *cacheDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
[cacheDirectory setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];

このコードを実行すると、アプリのキャッシュディレクトリがデバイスのバックアップ対象から除外されます。

まとめ

Objective-Cを使用して、NSUserDefaultsのカスタマイズ方法を学ぶことができたかと思います。

カスタムクラスを利用したデータの保存や、同期のカスタマイズ、容量の節約方法、そしてバックアップの除外設定など、さまざまなカスタマイズ方法を取り入れることで、より効率的かつ効果的にNSUserDefaultsを活用することができます。

これらの手法を活用し、アプリ開発においてユーザー体験を向上させることを心がけましょう。