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