1

我有两个 NSData 对象要存储在第三个 NSData 对象中。这个想法是我想在以后解码较大的对象时使其变得容易,以便彼此独立地获取两个较小的对象,而不必担心它们的相对大小或数据类型。

似乎最好的方法是使用 NSKeyedArchiver 在较大的 NSData 对象中创建一种根级键值结构,在其中我可以将两个较小的对象存储在单独的键中。这就是我在这里尝试做的事情:

NSData *data1Before = [@"abcdefgh" dataUsingEncoding:NSUTF8StringEncoding];
NSData *data2Before = [@"ijklmnop" dataUsingEncoding:NSUTF8StringEncoding];

NSMutableData *allData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:allData];
[archiver encodeObject:data1Before forKey:@"key1"];
[archiver encodeObject:data2Before forKey:@"key2"];
[archiver finishEncoding];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:allData];
NSData *data1After = [unarchiver decodeObjectForKey:@"key1"];
NSData *data2After = [unarchiver decodeObjectForKey:@"key2"];
[unarchiver finishDecoding];

NSString *string1After = [NSString stringWithUTF8String:[data1After bytes]];
NSString *string2After = [NSString stringWithUTF8String:[data2After bytes]];

NSLog(@"after1: %@",string1After);
NSLog(@"after2: %@",string2After);

问题是,当你一遍又一遍地运行这段代码时,你会从 NSLog 语句中得到各种不同的结果——有时特殊字符会附加到字符串的末尾,有时它们只是 NULL。

看来这种损坏与我正在使用的这种“双重编码”过程有关。当我修改代码以便 NSKeyedArchiver 直接在 NSStrings 上而不是在 NSData 对象上调用 encodeObject 时,我以后可以使用 decodeObjectForKey 并毫无问题地获取这些字符串 - 完全没有损坏。

有没有比使用 NSKeyedArchiver 更好的方法呢?还是我使用不当?

4

1 回答 1

1

感谢 rmaddy 上面的回答 - 我只需要替换它:

[NSString stringWithUTF8String:[data1After bytes]];

有了这个:

[[NSString alloc] initWithData:data1After encoding: NSUTF8StringEncoding];

并修复了它。

于 2013-03-05T07:40:23.533 回答