encodeData writeToFile EXC_BAD_ACCESS

时间:2014-07-14 14:38:42

标签: ios cocos2d-iphone unrecognized-selector

我正在尝试保存我的游戏数据。我从Ray开始阅读本教程:How to Save your Game’s Data: Part 1/2

-(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 code = 1 address = 0xc exc_bad_access code = 1 address = 0x7000000c exc_bad_access code = 1 address = 0x1000000c      在这一行:

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

我该如何解决这个问题?教程中的源代码工作正常。但在我的游戏中它崩溃了。

更新

在Ray的源代码中 Objective C ARC:是。但后来我使用ARC,它给了我很多错误。

编辑:我稍微更改了代码并转到教程的第二部分。首次正常保存/加载工作,但在第二次运行时,它只能正确加载一次,当我尝试更改分数值时,我有 exc_bad_access

  +(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方法调用这一行 - 它的工作原理。

1 个答案:

答案 0 :(得分:0)

检查您的+[RWGameData filePath]方法实施。它似乎实际上是返回一个数组,而不是预期的字符串。

您可以从NSCFArray(这是NSArray的内部实现)抛出的“无法识别的选择器”消息中看到此消息。那个数组抱怨有人试图访问一个只存在于字符串上的方法。由于您未直接自行执行此操作,因此-writeToFile:...方法必须对-filePath RWGameData上{{1}}的结果执行此操作。