2009-12-20
■[objective-c][tips]独自のオブジェクトをシリアライズできるようにする。
久しぶりに扱ってはまった。調べ直したのでメモっておく。
例えば、NSUserDefaultやSQLiteを使ってデータを保存したいとき、独自に作成したオブジェクトだとそのままでは保存できない。
それらのデータストアはNSStringやNSArray、NSDataなど特定のオブジェクト以外はデータを保持しておいてくれないので、そういう時には独自オブジェクトにNSCodingインターフェースを実装して、アーカイバを使ってNSDataにシリアライズしてから保存するようにする。
保存対象のオブジェクト:
@interface MyObject : NSObject<NSCoding> { NSString *aString; NSString *bString; } @end @implementation MyObject // ... // encodeWithCoderとinitWithCoderを実装 - (void) encodeWithCoder:(NSCoder *)coder { // シリアライズ時に呼び出される。 [coder encodeObject:aString forKey:@"aString"]; [coder encodeObject:bString forKey:@"bString"]; } - (id) initWithCoder:(NSCoder *)coder { // デシリアライズ時に呼び出されるイニシャライザ if (self = [super init]) { // オブジェクトの生成ではないので、retainを忘れないように。 aString = [[coder decodeObjectForKey:@"aString"] retain]; bString = [[coder decodeObjectForKey:@"bString"] retain]; } return self; } // ... @end
こんな感じで実装しておく。
それで、使い方は以下の通り。例えばNSUserDefaultsを使う場合。
// 配列の中にぶち込んであっても大丈夫。 NSArray *array = [NSArray arrayWithObjects: [[MyObject allow] init], @"hogehoge", nil ]; // NSKeyedArchierでシリアライズ NSData* data = [NSKeyedArchiver archivedDataWithRootObject:array]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"array"]; // NSKeyedUnarchiverで、デシリアライズ NSData *deData = [[NSUserDefaults standardUserDefaults] objectForKey:@"array"]; NSArray *deArray = [NSKeyedUnarchiver unarchiveObjectWithData:]; for (id myObj in deArray) { NSLog(@"%@", [myObj className]); // MyObject, NSStringと出る。 }
トラックバック - http://d.hatena.ne.jp/Yudoufu/20091220/1261325317
リンク元
- 134 http://search.yahoo.co.jp/search?p=?????í????泣?????&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 44 http://gmail.1o4.jp/imap.html
- 42 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=DxI&q=AU 入力モード &btnG=検索&lr=lang_ja&aq=f&oq=
- 38 http://hex6.net/blog/?p=15
- 27 http://labs.unoh.net/2009/07/post_135.html
- 23 http://lolipoking.lolipop.jp/page/patio.cgi?mode=view&no=7655
- 21 http://www.google.co.jp/search?hl=ja&source=hp&q=ゆどうふろぐ&btnG=Google+検索&lr=&aq=f&oq=
- 21 http://www.thinkit.co.jp/article/143/4/3.html
- 20 http://www.akiyan.com
- 19 http://ameblo.jp/linking/entry-10141193672.html
