3番目のNSDataオブジェクト内に保存したい2つのNSDataオブジェクトがあります。アイデアは、後で大きなオブジェクトをデコードするときに、相対的なサイズやデータ型を気にせずに、2つの小さなオブジェクトを互いに独立して取得できるようにすることです。
これを行う最良の方法は、NSKeyedArchiverを使用して、大きなNSDataオブジェクト内に一種のルートレベルのキー値構造を作成することです。この構造では、2つの小さなオブジェクトを別々のキーに格納できます。それが私がここでやろうとしたことです:
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がNSDataオブジェクトではなくNSStringsで直接encodeObjectを呼び出すようにコードを変更すると、後でdecodeObjectForKeyを使用して、問題なくこれらの文字列を取得できます。破損はまったくありません。
NSKeyedArchiverを使用するよりもこれを行うためのより良い方法はありますか?それとも私はそれを間違って使用していますか?