2014-07-14 37 views
0

我想保存我的遊戲數據。我開始本教程由雷:How to Save your Game’s Data: Part 1/2encodeData writeToFile EXC_BAD_ACCESS

一切工作正常,除了-(void)save;

-(void)save 
{ 
    NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject: self]; 
    [encodedData writeToFile:[RWGameData filePath] atomically:YES]; 
} 

當我把這種方法我得到這樣的;

-[__NSCFArray getFileSystemRepresentation:maxLength:]: unrecognized selector sent to instance 0x1663dcc0 
2014-07-14 18:42:15.029 App[3629:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray getFileSystemRepresentation:maxLength:]: unrecognized selector sent to instance 0x1663dcc0' 

或者這樣: EXC_BAD_ACCESS代碼= 1個地址=位於0xCEXC_BAD_ACCESS代碼= 1個地址=該線路上0x7000000cEXC_BAD_ACCESS代碼= 1個地址= 0x1000000c

[encodedData writeToFile:[RWGameData filePath] atomically:YES]; 

我該如何解決這個問題?來自教程的源代碼正常工作。但在我的比賽中,它墜毀了。

UPDATE:

在雷的源代碼目標C ARC:YES。但後來我用ARC,它給了我很多錯誤。

編輯:我改變了一些代碼,並轉到教程的第二部分。保存/加載工作正常第一次運行,但第二次運行它只能正確加載一次,當我嘗試更改分數值時,我有exc_bad_access。在此行中我gamelayer更新比分

+(instancetype)loadInstance 
    { 
    pathString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"gamedata"]; 

NSData* decodedData = [NSData dataWithContentsOfFile: pathString]; 
if (decodedData) { 
    //1 
    NSString* checksumOfSavedFile = [KeychainWrapper computeSHA256DigestForData: decodedData]; 

    //2 
    NSString* checksumInKeychain = [KeychainWrapper keychainStringFromMatchingIdentifier: SSGameDataChecksumKey]; 

    //3 
    if ([checksumOfSavedFile isEqualToString: checksumInKeychain]) { 
     RWGameData* gameData = [NSKeyedUnarchiver unarchiveObjectWithData:decodedData]; 
     return gameData; 
    } 
    //4 
} 

return [[RWGameData alloc] init]; 
} 

    -(void)save 
{ 
    pathString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"gamedata"]; 

NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject: self]; 
[encodedData writeToFile:pathString atomically:YES]; 

NSString* checksum = [KeychainWrapper computeSHA256DigestForData: encodedData]; 
if ([KeychainWrapper keychainStringFromMatchingIdentifier: SSGameDataChecksumKey]) { 
    [KeychainWrapper updateKeychainValue:checksum forIdentifier:SSGameDataChecksumKey]; 
} else { 
    [KeychainWrapper createKeychainValue:checksum forIdentifier:SSGameDataChecksumKey]; 
} 

if([NSUbiquitousKeyValueStore defaultStore]) { 
    [self updateiCloud]; 
} 
} 

EXC_BAD_ACCSES:

[RWGameData sharedGameData].score += 1; 

但是,如果我從調用init方法這一行 - 它的工作。

回答

0

檢查您的+[RWGameData filePath]方法實施。它似乎實際上正在返回一個數組,而不是預期的字符串。

您可以從NSCFArray(這是NSArray的內部實現)引發的「無法識別的選擇器」消息中看到此消息。該數組抱怨有人試圖訪問只存在於字符串上的方法。由於您不是直接執行此操作,因此-writeToFile:...方法必須對-filePath的結果RWGameData執行此操作。

+0

你說得對。來自'-writeToFile'的[RWGameData filePath]返回一些隨機的東西,比如圖片名稱,CCFrameSprites,數組或者其他。我怎樣才能解決這個問題? – flowmachine1

+0

您應該在問題中發佈該方法。它與您發佈的教程鏈接中提供的實施有多接近? –

+0

它是一樣的。 – flowmachine1