Ios encodeData writeToFile EXC\u错误访问

Ios encodeData writeToFile EXC\u错误访问,ios,cocos2d-iphone,unrecognized-selector,Ios,Cocos2d Iphone,Unrecognized Selector,我正在尝试保存我的游戏数据。我从Ray的本教程开始: 一切正常,除了-无效保存 当我调用这个方法时,我得到了这个 -[__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 'NS

我正在尝试保存我的游戏数据。我从Ray的本教程开始:

一切正常,除了-无效保存

当我调用这个方法时,我得到了这个

 -[__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\U bad\U访问代码=1地址=0xc或exc\U bad\U访问代码=1地址=0x700000C或exc\U bad\U访问代码=1地址=0x1000000c 在这一行:

 [encodedData writeToFile:[RWGameData filePath] atomically:YES];
我怎样才能解决这个问题?教程中的源代码运行良好。但在我的游戏中,它崩溃了

更新:

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

编辑:我稍微修改了代码,然后转到教程的第二部分。第一次运行时保存/加载工作正常,但第二次运行时仅正确加载一次,当我尝试更改分数值时,我有exc_bad_访问权限

更新分数后,EXC_BAD_在my gamelayer的这一行访问:

但如果我从init方法调用这一行,它就可以工作了

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


您可以从NSCFArray抛出的无法识别的选择器消息中看到这一点,NSCFArray是NSArray的内部实现。该数组抱怨有人试图访问其上仅存在于字符串上的方法。由于您自己没有直接这样做,-writeToFile:。。。方法必须在RWGameData上的-filePath的结果上执行此操作。

您是对的。[RWGameData filePath]from-writeToFile返回一些随机信息,如图像名称、CCFrameSprites、数组等。我怎样才能解决这个问题?你应该在问题中发布这个方法。它与您发布的教程链接中给出的实现有多接近?
 [encodedData writeToFile:[RWGameData filePath] atomically:YES];
  +(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];
}
}
 [RWGameData sharedGameData].score += 1;