2012/07/30更新

[XCODE] 簡単にデータ永続化を行えるNSUserDefaultsの使い方、制約事項、など

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日は、iOSで用意されているデータ永続化の方法で、とっても簡単なUserDefaultsの使い方を学んだので、 ブログに残したいと思います。

NSUserDefaults



NSUserDefaultsとは

iOSで用意されているデータ永続化の方法は、CoreDataやファイルシステムへの保存がありますが、 それよりも簡単な方法で、NSUserDefaultsを用いる方法があります。
これは、ちょっとしたアプリ設定(背景色とか日付形式とか)を保存するのに、わざわざCoreDataなどの 仕組みを組み込む必要がないので、とっても便利です。



NSUserDefaultsの使い方

NSUserDefaultsの使い方はとっても簡単です。

NSUserDefaultsインスタンスを取得する

まずは、NSUSerDefaultsのインスタンスを以下のように取得します。
NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];


NSUserDefaultsに値を設定し、永続化を行う

NSUserDefaultsには、以下のようにデータ永続化を行うことができます。
// プリミティブ型を保存する
[userDefaults setBool:YESforKey:@"showDetail"];
[userDefaults setFloat:1.0fforKey:@"alpha"];
[userDefaults setInteger:50forKey:@"rowHeight"];
[userDefaults setDouble:1.1forKey:@"amount"];

// NSURLを保存する
[userDefaults setURL:[NSURLURLWithString:@"http://www.yoheim.net/"] forKey:@"homeURL"];

// オブジェクト型を保存する(※1)
[userDefaults setObject:@"string"forKey:@"someName"];
※1 setObject:(id)で設定できるクラスは、「NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary」のいずれかである必要があります。
また、NSArray, NSDictionaryの場合、保持する値も上記クラスのいずれかである必要があります。

もし上記以外のインスタンスを保存したい場合には、NSDataに変換(例 UIImage→NSData)してから、NSUserDefaultsに保存する必要があります。

また、ユーザー作成クラスでも、NSCodingプロトコルを実装したクラスで、インスタンス情報をNSDataに変換 すれば、NSUserDefaultsに保存する事が可能です。



NSUserDefaultsから値を取り出す

NSUserDefaultsから値を取り出すには、以下のように行うことで実現出来ます。
// プリミティブ型を取り出す
BOOL boolValue = [userDefaults boolForKey:@"bool"];
float floatValue = [userDefaults floatForKey:@"float"];
int intValue = [userDefaults integerForKey:@"int"];
double doubleValue = [userDefaults doubleForKey:@"double"];

// オブジェクトを型指定して取り出す
NSArray *array = [userDefaults arrayForKey:@"array"];
NSData *data = [userDefaults dataForKey:@"data"];
NSDictionary *dict = [userDefaults dictionaryForKey:@"dict"];
NSArray *strArray = [userDefaults stringArrayForKey:@"strArray"];
NSString *string = [userDefaults stringForKey:@"string"];
NSURL *url = [userDefaults URLForKey:@"url"];

// オブジェクトの型は気にせず取りだす
id object = [userDefaults objectForKey:@"object"];


NSData型に変換して保存していた値については、元の型に変換(例:NSData→UIImage)することで、 もとの状態を取得する事が可能です。

ただし、NSCodingプロトコルを実装した全てのクラスが、全くの元通りに復元できない事は、注意すべき点です。
例えば、UIWebViewは、NSCodingプロトコルを実装していますが、表示していたDOM状態やJavaScript変数状態 などは、永続化されません。



参考資料

今回は、以下のリファレンスを参照しました。ありがとうございました(*゚▽゚)ノ
NSUserDefaults Class Reference



最後に

Cocoaってこんなに便利なモノが準備されていたんですね。
ちょっとした設定を格納する例で説明される事が多いですが、少し大きなデータでも保存できるようです。
Key-Valueストアとして、便利な永続化機能だなぁと感じました(`・ω・´)

本記事をお読み頂きましてありがとうございました。少しでも参考になれば幸いです。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。