NSUserDefaults/NSCodingによる設定情報の保存 (6/8)
作成:2013-03-25 08:26
更新:2013-03-25 08:26
更新:2013-03-25 08:26
■NSUserDefaultsを拡張する
NSUserDefaultsには、作成したSampleDataインスタンスを保存するためのメソッドというのは用意されていません。setObject: forKey:で保存しようとすると、今の段階では失敗してしまいます。
先ほどのNSCodingの実装は、あくまで「エンコードするための機能」を追加したものです。どういうことか?というと、つまり、SampleDataインスタンスをバイナリデータに変換したり、逆にバイナリデータからSampleDataインスタンスに戻せるようになった、ということなのです。
バイナリデータというのは、Objective-Cでは「NSData」というインスタンスとして扱えるようになっています。すなわち、これでSampleDataインスタンスをNSDataインスタンスに変換できるようになったのです。
NSDataは、NSUserDefaultsで保存することができます。そこで、NSUserDefaultsに、SampleDataを読み書きするためのメソッドを追加することにしましょう。
下にそのためのコードを掲載しておきます。ここでは「setSampleData: forKey:」と「sampleDataForKey:」という2つのメソッドを追加することにします。それぞれ、SampleData.h/SampleData.mあたりに追記しておけばよいでしょう。
ここでは「NSKeyedArchiver」「NSKeyedUnarchiver」というクラスを利用しています。それぞれ以下のメソッドを使ってバイナリデータに変換することができます。
・インスタンスをNSDataに変換する
・NSDataをインスタンスに変換する
こうしてSampleDataとNSDataをやり取りできるようになったら、後はsetObject: forKey:やdataForKey:メソッドを使って初期設定に保存や読み込みができるようになる、というわけです。
先ほどのNSCodingの実装は、あくまで「エンコードするための機能」を追加したものです。どういうことか?というと、つまり、SampleDataインスタンスをバイナリデータに変換したり、逆にバイナリデータからSampleDataインスタンスに戻せるようになった、ということなのです。
バイナリデータというのは、Objective-Cでは「NSData」というインスタンスとして扱えるようになっています。すなわち、これでSampleDataインスタンスをNSDataインスタンスに変換できるようになったのです。
NSDataは、NSUserDefaultsで保存することができます。そこで、NSUserDefaultsに、SampleDataを読み書きするためのメソッドを追加することにしましょう。
下にそのためのコードを掲載しておきます。ここでは「setSampleData: forKey:」と「sampleDataForKey:」という2つのメソッドを追加することにします。それぞれ、SampleData.h/SampleData.mあたりに追記しておけばよいでしょう。
ここでは「NSKeyedArchiver」「NSKeyedUnarchiver」というクラスを利用しています。それぞれ以下のメソッドを使ってバイナリデータに変換することができます。
・インスタンスをNSDataに変換する
NSData* 変数 = [NSKeyedArchiver
archivedDataWithRootObject:《id》];
・NSDataをインスタンスに変換する
id 変数 = [NSKeyedUnarchiver
unarchiveObjectWithData:《NSData》];
こうしてSampleDataとNSDataをやり取りできるようになったら、後はsetObject: forKey:やdataForKey:メソッドを使って初期設定に保存や読み込みができるようになる、というわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※NSUserDefaultsの拡張(SampleData.h) @interface NSUserDefaults(SampleDataSupport) -(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey; -(SampleData*)sampleDataForKey:(NSString*)aKey; @end ※NSUserDefaultsの拡張(SampleData.m) @implementation NSUserDefaults(SampleDataSupport) -(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey { NSData* data = [NSKeyedArchiver archivedDataWithRootObject:obj]; [self setObject:data forKey:aKey]; } -(SampleData*)sampleDataForKey:(NSString*)aKey { SampleData* obj = nil; NSData* data = [self dataForKey:aKey]; if (data != nil) { obj = (SampleData*)[NSKeyedUnarchiver unarchiveObjectWithData:data]; } return obj; } @end
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る