NSArray の中味が独自クラスなら、NSUserDefaults への格納・展開にはシリアライズ・デシリアライズした方が良さげ

投稿者: | 2013/05/13

NSArray をNSUserDefaults に格納・展開する場合、通常はそのままでOK

これは普通に問題なし。

NSArray* myArray = @[@"hoge", @"piyo", @"fuga"];
[[NSUserDefaults standardDefaults] setObjec:myArray forKey:@"MY_ARRAY"];


 

配列内に独自クラスが入っていると何か文句言われる

これだと、以下の様な警告が出る。(例:配列の中味がEvernote のEDAMTag クラス)

Note that dictionaries and arrays in property lists must also contain only property values.

__block NSArray* myTags = [[NSArray alloc] init];
[[EvernoteNoteStore noteStore] listTagsWithSuccess:^(NSArray *tags) {
    myTags = tags;
} failure:nil];
[[NSUserDefaults standardDefaults] setObjec:myTags forKey:@"MY_TAGS"];

 

 

NSData にシリアライズすれば文句言われない。

これなら問題なし。

__block NSData* myDat = [[NSArray alloc] init];
[[EvernoteNoteStore noteStore] listTagsWithSuccess:^(NSArray *tags) {
    // NSArray をNSData にシリアライズ
    myDat = [NSKeyedArchiver archivedDataWithRootObject:tags];
} failure:nil];
[[NSUserDefaults standardDefaults] setObjec:myDat forKey:@"MY_DAT"];

 

読み出す時はデシリアライズを忘れずに

NSData になっているので、再び使う場合はデシリアライズが必要。

NSData* myDat = [[NSUserDefaults standardDefaults] objectForKey:@"MY_DAT"];
// NSData をデシリアライズ
NSArray* myTags = [NSKeyedUnarchiver unarchiveObjectWithData:myDat];

 

参考

@glassonion1 さんの、以下の記事を参考にさせて頂きました。
(つか、まんまです。)



 



 

 



 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください