我通常用这样的NSFileWrapper
编码我的数据(我省略了NSFileWrapper位):
-(NSData*)encodeObject:(id<NSCoding>)o {
@autoreleasepool {
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:o forKey:@"data"];
[archiver finishEncoding];
return data;
}
}
我这样做时通常会得到我的数据:
- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {
NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
if (!wrapper) {
NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
return nil;
}
NSData *data = [wrapper regularFileContents];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSLog(@"%@", [unarchiver decodeObjectForKey:@"data"]);
return [unarchiver decodeObjectForKey:@"data"];
}
有时,我会回复NSData
(它不是零),但[unarchiver decodeObjectForKey:@"data"]
将返回NIL。看起来好像没有对象@“数据”的对象,即使应该有。我想在编码时肯定会出现问题,但我不确定如何解决这个问题。我可以随身携带data
中的任何内容并对其进行编码,而不用担心它是否有正确的密钥?我的意思是应该只有一个关键的“数据”。
答案 0 :(得分:1)
为什么你的代码如此复杂:) NSKeyedArchiver
类有辅助方法,可以更简单地完成你想做的事情:
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];