1

所以我在尝试实现时遇到了一个异常,NSKeyedUnarchiver因为我试图用NSUsersDefaults. 因为我不断收到一个错误,说我有非属性,所以我决定将它们存档到NSData. 现在我收到此错误:“无法理解的存档”。

这是我归档的方式(我已经测试了所有对象都为空,但它们都不是):

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"];

这是我取消归档的方式(再次测试所有内容是否为空):

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 协议,并实现其两种方法(编码和解码)。然后,您可以在自定义对象数组上使用 NSKeyedArchiver 存档。NSKeyedArchiver 将对每个对象及其包含的任何对象(如果它是一个集合)调用 encodeWithCoder。

编辑:在数组上调用 NSKeyedArchiver ,而不是每个对象。然后,当您取消归档时,再次将其取消归档到数组中。

于 2012-05-17T03:51:09.287 回答