我正在尝试保存我的游戏数据。我从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方法调用这一行 - 它的工作原理。
答案 0 :(得分:0)
检查您的+[RWGameData filePath]
方法实施。它似乎实际上是返回一个数组,而不是预期的字符串。
您可以从NSCFArray
(这是NSArray
的内部实现)抛出的“无法识别的选择器”消息中看到此消息。那个数组抱怨有人试图访问一个只存在于字符串上的方法。由于您未直接自行执行此操作,因此-writeToFile:...
方法必须对-filePath
RWGameData
上{{1}}的结果执行此操作。