0

我通常以这样的方式编码我的数据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返回(不是 nil),但[unarchiver decodeObjectForKey:@"data"]会返回 NIL。看起来好像没有键 @"data" 的对象,即使应该有。我想编码时一定出了问题,但我不知道如何解决这个问题。我可以只取其中的任何内容data并对其进行编码,而不用担心它是否有正确的密钥吗?我的意思是应该只有一个关键的“数据”。

4

1 回答 1

1

为什么您的代码如此复杂:)NSKeyedArchiver该类具有辅助方法,可以更简单地执行您想要的操作:

// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o]; 

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2012-10-01T10:59:03.297 回答