, 나는 좋은 방법은 내 클래스 정의는 다음과 같습니다 NSKeyedArchiver와 NSKeyedUnarchiver 를 사용하는 것으로, 인터넷에서 발견 구현 방법 initWithCoder:
및 encodeWithCoder:
이 방법 :아이폰 직렬화 문제
- (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];
}
}
그리고 보관 및 보관 해제 데이터 이러한 방법을 사용
두 가지 문제점이 있습니다.
1) arGuessedLettersPos
이있는 행은 주석 처리됩니다. 왜냐하면이 배열을 인코딩 할 때마다 오류가 발생하고 (이 아카이버는 구조체를 인코딩 할 수 없기 때문입니다.)이 배열은 CGRect 구조체를 저장하는 데 사용됩니다. 인터넷에서 솔루션을 보았습니다. 배열의 각 CGRect
은 NSString
(NSStringFromCGRect()
사용)으로 변환 된 다음 저장됩니다. 좋은 접근인가?
2) 이것은 나를 위해 더 큰 문제입니다. 이 줄에 주석을 달고 코드를 성공적으로 실행 한 다음 데이터를 저장 (보관) 한 다음로드 (보관 해제)하려고하면 데이터가로드되지 않습니다. 오류가 없지만 currentGame
개체에로드해야하는 데이터가 없습니다.
제게 조언 해 주시겠습니까? 이것은 처음으로 아카이브와 아카이브를 사용하고 있습니다.
답장을 보내 주셔서 감사합니다.
당신은 여기서 좋은 단서를 가지고있는 것처럼 들립니다. 코드 내에서 원하는 파일이 있는지 확인할 수 있습니다. 임시 위치에 저장되었거나 파일 이름에 오타가있을 수 있습니다. 또 다른 아이디어는 unarchiveObjectWithFile에 대한 호출 바로 전에 NSLog를 추가하여 정확한 행이 실행 중인지 확인하는 것입니다. 모험을 느끼는 경우, 거기에 중단 점을 추가하고 코드를 살펴볼 수 있습니다. – Tyler