0

次のように、オブジェクトをエンコードしてファイルに保存しています。
[NSKeyedArchiver archiveRootObject:self.parent toFile:@"gameScene.plist"];

次のようにデコードします。
scene = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"gameScene.plist"] retain];

initWithCoderシミュレーターでは、上記のデコード コードはクラスのメソッドを適切に呼び出します。しかし、デバイスで同じことを実行すると、「initWithCoder is not called nor theinit」メソッドと「nil」オブジェクトが返されます。

誰かがここで何が悪いのか説明してもらえますか?

編集:テスト目的で、サブオブジェクトをデコードして my のすべてのエンコーディングをコメントアウトする代わりに、initとの両方で同じステートメントのセットを指定しました。initWithCoderinitWithCoderencodeWithCoder

4

1 に答える 1

2

iOS デバイスのルート ディレクトリに書き込めないためでしょうか。のパスは、iOS デバイスでは書き込み可能ではありませんが、OS X では許可されることを@"gameScene.plist"意味すると思います。メソッドはおそらくここに戻っており、ファイルが正常に作成されなかったことを示しています。/gameScene.plist-archiveRootObject:toFile:NO

次のようなことをしたいかもしれません:

NSURL *documentsURL = (NSURL *) [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject];
NSString *filePath = [[documentsURL path] stringByAppendingPathComponent: @"gameScene.plist"];

BOOL success = [NSKeyedArchiver archiveRootObject: self.parent toFile: filePath];
NSLog(@"Archive Success... %s", (success) ? "YES" : "NO");

NSLog(@"File Exists... %s", [[NSFileManager defaultManager] fileExistsAtPath: filePath] ? "YES" : "NO");

id unarchivedObject = [[NSKeyedUnarchiver unarchiveObjectWithFile: filePath] retain];
NSLog(@"Unarchive Success... %s", (unarchivedObject != nil) ? "YES" : "NO");
NSLog(@"Equal Objects... %s", [self.parent isEqual: unarchivedObject] ? "YES" : "NO");
于 2011-11-03T13:25:37.340 に答える