[XCODE] 簡単にデータ永続化を行えるNSUserDefaultsの使い方、制約事項、など
こんにちは、@yoheiMuneです。
今日は、iOSで用意されているデータ永続化の方法で、とっても簡単なUserDefaultsの使い方を学んだので、 ブログに残したいと思います。
これは、ちょっとしたアプリ設定(背景色とか日付形式とか)を保存するのに、わざわざCoreDataなどの 仕組みを組み込む必要がないので、とっても便利です。
また、NSArray, NSDictionaryの場合、保持する値も上記クラスのいずれかである必要があります。
もし上記以外のインスタンスを保存したい場合には、NSDataに変換(例 UIImage→NSData)してから、NSUserDefaultsに保存する必要があります。
また、ユーザー作成クラスでも、NSCodingプロトコルを実装したクラスで、インスタンス情報をNSDataに変換 すれば、NSUserDefaultsに保存する事が可能です。
NSData型に変換して保存していた値については、元の型に変換(例:NSData→UIImage)することで、 もとの状態を取得する事が可能です。
ただし、NSCodingプロトコルを実装した全てのクラスが、全くの元通りに復元できない事は、注意すべき点です。
例えば、UIWebViewは、NSCodingプロトコルを実装していますが、表示していたDOM状態やJavaScript変数状態 などは、永続化されません。
NSUserDefaults Class Reference
ちょっとした設定を格納する例で説明される事が多いですが、少し大きなデータでも保存できるようです。
Key-Valueストアとして、便利な永続化機能だなぁと感じました(`・ω・´)
本記事をお読み頂きましてありがとうございました。少しでも参考になれば幸いです。
今日は、iOSで用意されているデータ永続化の方法で、とっても簡単なUserDefaultsの使い方を学んだので、 ブログに残したいと思います。
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ストアとして、便利な永続化機能だなぁと感じました(`・ω・´)
本記事をお読み頂きましてありがとうございました。少しでも参考になれば幸いです。