je dois sauver ma propre classe créée pour déposer, je l'ai trouvé sur internet, que la bonne approche consiste à utiliser NSKeyedArchiver et NSKeyedUnarchiver Ma définition de classe ressemble à ceci:problème iPhone sérialisation
@interface Game : NSObject <NSCoding> {
NSMutableString *strCompleteWord;
NSMutableString *strWordToGuess;
NSMutableArray *arGuessedLetters; //This array stores characters
NSMutableArray *arGuessedLettersPos; //This array stores CGRects
NSInteger iScore;
NSInteger iLives;
NSInteger iRocksFallen;
BOOL bGameCompleted;
BOOL bGameOver;
}
J'ai les méthodes mises en œuvre initWithCoder:
et encodeWithCoder:
ainsi:
- (id)initWithCoder:(NSCoder *)coder
{
if([coder allowsKeyedCoding])
{
strCompleteWord = [[coder decodeObjectForKey:@"CompletedWord"] copy];
strWordToGuess = [[coder decodeObjectForKey:@"WordToGuess"] copy];
arGuessedLetters = [[coder decodeObjectForKey:@"GuessedLetters"] retain];
// arGuessedLettersPos = [[coder decodeObjectForKey:@"GuessedLettersPos"] retain];
iScore = [coder decodeIntegerForKey:@"Score"];
iLives = [coder decodeIntegerForKey:@"Lives"];
iRocksFallen = [coder decodeIntegerForKey:@"RocksFallen"];
bGameCompleted = [coder decodeBoolForKey:@"GameCompleted"];
bGameOver = [coder decodeBoolForKey:@"GameOver"];
}
else
{
strCompleteWord = [[coder decodeObject] retain];
strWordToGuess = [[coder decodeObject] retain];
arGuessedLetters = [[coder decodeObject] retain];
// arGuessedLettersPos = [[coder decodeObject] retain];
[coder decodeValueOfObjCType:@encode(NSInteger) at:&iScore];
[coder decodeValueOfObjCType:@encode(NSInteger) at:&iLives];
[coder decodeValueOfObjCType:@encode(NSInteger) at:&iRocksFallen];
[coder decodeValueOfObjCType:@encode(BOOL) at:&bGameCompleted];
[coder decodeValueOfObjCType:@encode(BOOL) at:&bGameOver];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
if([coder allowsKeyedCoding])
{
[coder encodeObject:strCompleteWord forKey:@"CompleteWord"];
[coder encodeObject:strWordToGuess forKey:@"WordToGuess"];
[coder encodeObject:arGuessedLetters forKey:@"GuessedLetters"];
//[coder encodeObject:arGuessedLettersPos forKey:@"GuessedLettersPos"];
[coder encodeInteger:iScore forKey:@"Score"];
[coder encodeInteger:iLives forKey:@"Lives"];
[coder encodeInteger:iRocksFallen forKey:@"RocksFallen"];
[coder encodeBool:bGameCompleted forKey:@"GameCompleted"];
[coder encodeBool:bGameOver forKey:@"GameOver"];
}
else
{
[coder encodeObject:strCompleteWord];
[coder encodeObject:strWordToGuess];
[coder encodeObject:arGuessedLetters];
//[coder encodeObject:arGuessedLettersPos];
[coder encodeValueOfObjCType:@encode(NSInteger) at:&iScore];
[coder encodeValueOfObjCType:@encode(NSInteger) at:&iLives];
[coder encodeValueOfObjCType:@encode(NSInteger) at:&iRocksFallen];
[coder encodeValueOfObjCType:@encode(BOOL) at:&bGameCompleted];
[coder encodeValueOfObjCType:@encode(BOOL) at:&bGameOver];
}
}
et j'utiliser ces méthodes pour archiver les données et décompressez:
[NSKeyedArchiver archiveRootObject:currentGame toFile:strPath];
Game *currentGame = [NSKeyedUnarchiver unarchiveObjectWithFile:strPath];
J'ai deux problèmes. 1) Comme vous pouvez le voir, les lignes arGuessedLettersPos
sont commentées, parce que chaque fois que j'essaye de coder ce tableau, une erreur survient (cet archiveur ne peut pas coder les structures), et ce tableau est utilisé pour stocker les structures CGRect. J'ai vu une solution sur internet. Le fait est que tous les CGRect
du tableau sont convertis en NSString
(en utilisant NSStringFromCGRect()
), puis enregistrés. Est-ce une bonne approche?
2) Ceci est un plus gros problème pour moi. Même si je commente cette ligne, puis exécute le code avec succès, puis enregistrez (archive) les données et ensuite essayez de les charger (désarchiver), aucune donnée n'est chargée. Il n'y a pas d'erreur mais l'objet currentGame
n'a pas de données à charger.
Pourriez-vous me donner quelques conseils? C'est la première fois que j'utilise des archivers et des unarchivers.
Merci beaucoup pour chaque réponse.
On dirait que vous avez de bons indices pour travailler avec. Vous pouvez vérifier dans le code que le fichier désiré existe. Il peut être sauvegardé dans un emplacement temporaire, ou il peut y avoir une faute de frappe dans le nom du fichier, etc. Une autre idée consiste simplement à ajouter un NSLog juste avant votre appel à unarchiveObjectWithFile: pour vérifier que cette ligne exacte est en cours d'exécution. Si vous vous sentez aventureux, vous pouvez ajouter un point d'arrêt et parcourir le code. – Tyler