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 さんの、以下の記事を参考にさせて頂きました。
(つか、まんまです。)