自前のクラスでNSCodingプロトコルを採用する
encodeWithCoder と initWithCoder を以下のように実装する。
Hoge.h
@interface Hoge:NSObject <NSCoding>
@end
Hoge.m
@implementation Hoge {
NSString *_hoge;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_hoge forKey:@"hoge"];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self){
_hoge = [aDecoder decodeObjectForKey:@"hoge"];
}
return self;
}
@end
インスタンスをシリアライズして NSUserDefaults に保存する
シリアライズする時は [NSKeyedArchiver archivedDataWithRootObject:(id)id]
を使う。
Save.m
@implementation Save
- (void)save{
Hoge *_hoge = [[Hoge alloc] init];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_hoge];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:data forKey:@"hoge"];
[userDefaults synchronize];
}
@end
NSUserDefaultsからインスタンスを取り出してデシリアライズする
デシリアライズする時は [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data]
を使う。
Load.m
@implementation Load
- (void)load{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData *data = [userDefaults dataForKey:@"hoge"];
Hoge *_hoge = [NSKeyedUnarchiver unarchiveObjectWithData:data]
}
@end