0

NSDate オブジェクトがあります

NSDate* time = [NSDate date];

次を使用して NSKeyedArchiver を使用して保存しようとしています

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *saveFile = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"GameData.dat"];

NSMutableData *gameData = [NSMutableData data];
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData: gameData];

[encoder encodeObject: time forKey: @"time"];

[encoder finishEncoding];

[gameData writeToFile:saveFile atomically:YES];

そして、次を使用してロードします

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *file = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"GameData.dat"];
Boolean saveFileExists = [[NSFileManager defaultManager] fileExistsAtPath:file];

NSMutableData *gameData = [NSData dataWithContentsOfFile:file];
NSKeyedUnarchiver *decoder [[NSKeyedUnarchiver alloc] initForReadingWithData:gameData];

time = [decoder decodeObjectForKey: @"time"];

このメソッドは、オブジェクト以外のすべてのデータ型に対して正常に機能しますが、オブジェクトに対しては常に nil を返します。NSKeyedArchiver のアップルのドキュメントを読んだところ、正しく行う必要があるように見えますが、いつものように、明らかな何かが欠けている可能性があります。どんな助けでも大歓迎です。

4

1 に答える 1

0

すべてのオブジェクトをアーカイバに送信した後、アーカイバにfinishEncodingメッセージを送信して、データ ストリームを完了できるようにする必要があります。

+archivedDataWithRootObject:また、便利なメソッドまたは+archiveRootObject:toFile:onをチェックすることもできますNSKeyedArchiver。これにより、ほとんどのコードを 1 行に置き換えることができます。には、NSKeyedUnarchiver利用可能なアナログ方式があります。

于 2013-06-26T21:13:33.043 に答える