2011-11-03 85 views
0

我编码我的对象,并将其保存到一个文件,如下所示:
[NSKeyedArchiver archiveRootObject:self.parent toFile:@"gameScene.plist"];NSKeyedUnarchiver不调用-initWithCoder:在设备上(但好于模拟器)

并将其解码为:
scene = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"gameScene.plist"] retain];

在模拟器中,上述解码代码正确调用我的类的initWithCoder方法。但是当我在设备中运行相同的时候,会返回'initWithCoder is not called nor the init`方法和'nil'对象。

任何人都可以请解释这里错了什么?

编辑:出于测试目的,我给了相同的一组两个initinitWithCoder报表,而不是initWithCoder子对象进行解码,并在我的encodeWithCoder注释掉了所有的编码。

+0

这似乎很奇怪。也许确保'.plist'正确创建? –

+0

我是否需要手动创建plist?通过'[NSKeyedArchiver archiveRootObject:toFile:];'创建文件? – saiy2k

+0

它应该创建该文件。但我的意思是,确保文件在您读取之前确实存在! –

回答

2

也许是因为无法写入iOS设备的根目录?我认为@"gameScene.plist"的路径实际上意味着/gameScene.plist,它不能在iOS设备上写入,但可以在OS X上使用。-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"); 
+0

非常感谢答案:)正如你所说,该文件被保存到我的mac中的根目录...现在一切正常,再次thx :-) – saiy2k

+0

没问题。如果您有任何问题,我的电子邮件会列在我的个人资料页面上,我通常会有一个答案,即使它只是重定向您。 'C:' –

相关问题