提问者:小点点

NSKeyedUnarchiver始终返回nil


我正在尝试使用NSKeyDarchiver在应用程序关闭和运行周期之间存储数据。我试图存储的根对象是一个NSMutableArray,但在这个对象中有基础对象和自定义对象的集合(所有这些都符合NSCoding)。

文件保存代码如下

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile",documentsDirectory];
    
NSMutableData *pData = [[NSMutableData alloc] init];
    
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
[archiver encodeObject:self.sessionData];
[archiver finishEncoding];
[pData appendData:[archiver encodedData]];
[pData writeToFile:fullFileName atomically:YES];

该文件保存fine并且不会抛出异常。再次启动应用程序时,使用以下代码恢复该文件。

NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile", documentsDirectory];

NSData *pData = [[NSData alloc] initWithContentsOfFile:fullFileName];
NSError *error = nil;
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:pData error:&error];
self.sessionData = [unArchiver decodeObject];
[unArchiver finishDecoding];

在这一点上,sessionData总是为零,而pData是几千字节长的,因此我知道问题出在解码方法上。我已经尝试了[[NSMutableArray alloc]initWithCoder]和几乎所有NSKeyedUnarchiver方法的变体,但仍然没有用。我哪里错了?


共1个答案

匿名用户

解决了!

切换到使用nsfileManager并在数组和数据之间进行简单交换以存储在特定路径上。