2011-11-03 89 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:' –

相關問題