在NSKeyedUnarchiver对象中找不到密钥

时间:2012-10-01 10:43:46

标签: ios nsdata nskeyedarchiver nscoding nsfilewrapper

我通常用这样的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中的任何内容并对其进行编码,而不用担心它是否有正确的密钥?我的意思是应该只有一个关键的“数据”。

1 个答案:

答案 0 :(得分:1)

为什么你的代码如此复杂:) NSKeyedArchiver类有辅助方法,可以更简单地完成你想做的事情:

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

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];