実装方法initWithCoder:
とencodeWithCoder:
この方法:iPhoneのシリアル化の問題
- (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];
}
}
そして私は、アーカイブおよびアーカイブしないデータこれらのメソッドを使用します
私には2つの問題があります。この配列をエンコードしようとするたびにエラーが発生します(このアーカイバは構造体をエンコードできません)。この配列はCGRect構造体を格納するために使用されるため、arGuessedLettersPos
の行がコメントされています。 私はインターネット上で解決策を見ました。つまり、配列内のCGRect
はすべてNSString
(NSStringFromCGRect()
を使用)に変換されて保存されます。それは良いアプローチですか?
2)これは私にとって大きな問題です。この行をコメントしてからコードを正常に実行してから、データを保存(アーカイブ)してから、それらをロード(アーカイブ解除)しようとしても、データはロードされません。エラーはありませんが、currentGame
オブジェクトにはロードする必要があるデータがありません。
お願いします。これはアーカイバとアーカイブを使用している初めてです。
お返事ありがとうございました。
ここでは、うまくいく手がかりがあるようです。 コード内で目的のファイルが存在することを確認できます。一時的な場所に保存されているかもしれないし、ファイル名の入力ミスなどがあるかもしれません。もう一つのアイデアは、unarchiveObjectWithFileへの呼び出しの前にNSLogを追加するだけです。あなたが冒険を感じているなら、そこにブレークポイントを追加してコードを歩くことができます。 – Tyler