6

NSKeyedArchiverのパラメーターarchivedDataWithRootObject:は、保存しようとしている配列、またはNSDataに変換された配列であると想定されていますか?

4

2 に答える 2

16

虎杖の答えは正しいです。しかし、より正確には、配列の要素はプロトコルを実装し、メソッドinitWithCoder:およびencodeWithCoder:のように独自のコードを入力する必要があります。

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.title = [decoder decodeObjectForKey:@"title"];
        self.author = [decoder decodeObjectForKey:@"author"];
        self.published = [decoder decodeBoolForKey:@"published"];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:title forKey:@"time"];
    [encoder encodeObject:author forKey:@"author"];
    [encoder encodeBool:published forKey:@"published"];
}

次に、次のようにアーカイバとアンチャリバーを使用できます。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];

NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];

詳細については、「NSCodingを使用したObjective-Cオブジェクトのアーカイブ」を参照してください。

于 2013-01-29T08:28:48.717 に答える
14

ジェネリック配列をに変換するにはNSData、アーカイバが必要です。フィードの方法を知っている場合は、のNSData使用方法を知っていますNSKeyedArchiver。それで:

NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];

もちろん、あなたのarrayニーズのすべての要素は実装する必要がありますencodeWithCoder:

于 2010-09-19T16:42:57.267 に答える