1

NSKeyedUnarchiverを使用してカスタムオブジェクトの配列を保存しようとしているため、実装しようとしたときに例外が発生しましNSUsersDefaultsた。プロパティが含まれていないというエラーが発生し続けたため、それらをにアーカイブすることにしましたNSData。今、私はこのエラーを受け取ります:「理解できないアーカイブ」。

これが私がアーカイブしている方法です(私はすべてのオブジェクトがnullであるかどうかをテストしましたが、どれもnullではありません):

NSMutableArray *array = [[NSMutableArray alloc] initWithArray:anotherArray];
for (int i = 0; i < array.count; i++) {
    CustomObj *obj = [array objectAtIndex:i];
    NSData *newdata  = [NSKeyedArchiver archivedDataWithRootObject:obj];
    [array replaceObjectAtIndex:i withObject:newdata];
}
NSArray *newArray = [[NSArray alloc] initWithArray:array];
[coder setObject:newArray forKey:@"key"];

これが私がアーカイブを解除する方法です(ここでもすべてがnullについてテストされます):

if (!arrayM) { arrayM = [[NSMutableArray alloc] init]; NSLog(@"initialized"); }
else {
    for (int i = 0; i < arrayM.count; i++) {
        NSData *data = [arrayM objectAtIndex:i];
        --> The exception happens here: CustomObj *obj  = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        [arrayM replaceObjectAtIndex:i withObject:obj];
    }
}
4

1 に答える 1

1

NSKeyedArchiverでアーカイブしなかったのに、なぜNSKeyedUnarchiverを使用してデータを取り戻すことができると期待するのでしょうか。あなたがやりたい方法はこんな感じです。カスタムオブジェクトをNSCodingプロトコルに準拠させ、その2つのメソッド(エンコードとデコード)を実装します。次に、NSKeyedArchiverを使用してカスタムオブジェクトの配列をアーカイブできます。NSKeyedArchiverは、各オブジェクト、およびそれに含まれるすべてのオブジェクト(コレクションの場合)に対してencodeWithCoderを呼び出します。

編集:各オブジェクトではなく、配列でNSKeyedArchiverを呼び出します。次に、アーカイブを解除するときに、アレイに再度アーカイブを解除します。

于 2012-05-17T03:51:09.287 に答える