ios - NSData 异常 - "incomprehensible archive"

标签 ios nsuserdefaults nskeyedarchiver

所以我在尝试实现 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];
    }
}

最佳答案

您没有使用 NSKeyedArchiver 对其进行存档,那么您为什么期望能够使用 NSKeyedUnarchiver 来取回数据呢?你想要这样做的方式是这样的。使您的自定义对象符合 NSCoding 协议(protocol),并实现其两个方法(编码和解码)。然后您可以使用 NSKeyedArchiver 对您的自定义对象数组进行归档。 NSKeyedArchiver 将在每个对象及其包含的任何对象(如果它是一个集合)上调用 encodeWithCoder。

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

关于ios - NSData 异常 - "incomprehensible archive",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629438/

相关文章:

ios - Q : SenderId is a method and cannot be assigned

ios - 如何使用 SwiftyJSON 在 NSUserDefaults 中保存然后加载 JSON?

ios - [__SwiftValueencodeWithCoder :]: unrecognized selector sent to instance

ios - 如何在 Flutter 中读取已使用 iOS 中的 NSKeyedArchiver 写入文件系统的文件作为字符串?

ios - 归档/取消归档时对象是否被修改?

ios - UITableView 仅在第二次尝试时将数据发送到 Detail View Controller

ios - 如何在ios应用程序中将pdf页面转换为文本文件

ios - 如何创建更干净的 UIViewController?

objective-c - Objective-C : How to set key in NSUserDefault

ios - 如何从用户默认值 swift3 的字典数组中删除特定键值