さて、今回は自前で作成したクラス(カスタムクラス)を
NSUserDefaultsで保存する方法です。
NSUserDefaultsは
前回お話しした通り、
NSArrayやNSData型のオブジェクトしか保存することが出来ません。
通常ならこれでも、データを管理する分には事足りるんですが、
場合によっては自作したクラスでデータを管理したいですよね。
では、どのようにして自作クラスを保存すれば良いでしょうか

解決方法としては、自作クラスを
NSUserDefaultsでも扱える型にエンコードすることが挙げられます。
【自作クラスをNSDataにエンコードする方法】まず、NSDataにエンコードしたい自作クラスで
NSCodingプロトコルを使用します。
今回、エンコードするクラスをhoge
Objectクラスとします。
ヘッダー定義hogeObject.h
@interface hogeObject : NSObject <NSCoding>{
int hogeint;
NSString *hogestring;
}
@property int hogeint;
@property NSString *hogestring;
@end
実装部定義
hogeObject.m
@implementation hogeObject
// シリアライズ時に自動で呼び出される関数
- (void) encodeWithCoder:(NSCoder *)coder {
[coder encodeInt : hogeint forKey:@"hogeint"];
[coder encodeObject : hogestring forKey:@"hogestring"];
}
// デシリアライズ時に自動で呼び出される関数
- (id) initWithCoder:(NSCoder *)coder {
self = [self init];
if (self) {
hogeint = [coder decodeIntForKey : @"hogeint"];
hogestring = [coder decodeObjectForKey : @"hogestring"];
}
return self;
}
@end
上記の
encodeWithCoder関数は
hogeObjectクラスをNSDataにシリアライズ(暗号化)する際に、
initWithCoder関数は暗号化されたNSDataをhogeObjectにデシリアライズ(復号化)する際に
自動で呼び出されます。
あとは、NSUserDefaultsで保存、読み込みをする際に
以下のようにアーカイブ化する関数を呼び出せばOKです

この関数はどのクラスで定義しても構いません。
保存・読み込み関数
//hogeObjectの作成
hogeObject *hoge = [[hogeObject alloc] init];
hoge.hogeint = 0;
hoge.hogestring = @"hogehoge";
//保存用自作関数
- (void) saveUserDefaults{
NSData *data = [NSKeyedArchiver archivedDataWithRootObject : hoge]; //暗号化
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"hogedata"];
BOOL successful = [defaults synchronize];
if (successful) {
NSLog(@"データの保存に成功しました");
}
}
//読み込み用自作関数
- (void) loadUserDefaults{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults dataForKey:@"hogedata"];
if (data) {
NSLog(@"データを読み込みました");
hoge = [NSKeyedUnarchiver unarchiveObjectWithData:data]; //復号化
}else{
NSLog(@"データが格納されていません");
}
}
上記関数の太字部分がシリアライズ、デシリアライズするためのアーカイブ関数です。
この方法を覚えておけば
データの保存で困ることはまず無くなるでしょう。
それでは、また
