gpt4 book ai didi

iPhone 序列号问题

转载 作者:行者123 更新时间:2023-12-03 19:47:55 25 4
gpt4 key购买 nike

我需要将自己创建的类保存到文件中,我在互联网上发现,好的方法是使用 NSKeyedArchiver 和 NSKeyedUnarchiver我的类定义如下所示:

@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;
}

我已经这样实现了方法 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];
}
}

我使用这些方法来归档和取消归档数据:

[NSKeyedArchiver archiveRootObject:currentGame toFile:strPath];
Game *currentGame = [NSKeyedUnarchiver unarchiveObjectWithFile:strPath];

我有两个问题。

1) 正如你所看到的,带有 arGuessedLettersPos 的行被注释了,这是因为每次我尝试编码这个数组时,都会出现错误(这个归档器无法编码结构),并且使用了这个数组用于存储 CGRect 结构。我在互联网上看到了解决方案。问题是,数组中的每个 CGRect 都会转换为 NSString(使用 NSStringFromCGRect() ),然后保存。这是一个好方法吗?

2)这对我来说是个更大的问题。即使我注释掉这一行,然后成功运行代码,然后保存(存档)数据,然后尝试加载(取消存档)它们,也不会加载任何数据。没有任何错误,但 currentGame 对象没有应加载的数据。

您能给我一些建议吗?这是我第一次使用归档器和解归档器。

非常感谢您的每一个回复。

最佳答案

加载和保存的问题通过另一种方式解决了......

我没有实现 - (id)initWithCoder:(NSCoder )coder 和 - (void)encodeWithCoder:(NSCoder)coder 我使用了这个解决方案:

    NSMutableData *data = [NSMutableData alloc];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:self.strCompleteWord forKey:@"CompleteWord"];
[archiver encodeObject:self.strWordToGuess forKey:@"WordToGuess"];
[archiver encodeObject:self.arGuessedLetters forKey:@"GuessedLetters"];
//[coder encodeObject:self.arGuessedLettersPos forKey:@"GuessedLettersPos"];
[archiver encodeInteger:self.iScore forKey:@"Score"];
[archiver encodeInteger:self.iLives forKey:@"Lives"];
[archiver encodeInteger:self.iRocksFallen forKey:@"RocksFallen"];
[archiver encodeBool:self.bGameCompleted forKey:@"GameCompleted"];
[archiver encodeBool:self.bGameOver forKey:@"GameOver"];

[archiver finishEncoding];

[data writeToFile:strPath atomically:YES];

[data release];

    NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:strPath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

self.strCompleteWord = [[unarchiver decodeObjectForKey:@"CompletedWord"] copy];
self.strWordToGuess = [[unarchiver decodeObjectForKey:@"WordToGuess"] copy];
self.arGuessedLetters = [[unarchiver decodeObjectForKey:@"GuessedLetters"] retain];
//self.arGuessedLettersPos = [[unarchiver decodeObjectForKey:@"GuessedLettersPos"] retain];
self.iScore = [unarchiver decodeIntegerForKey:@"Score"];
self.iLives = [unarchiver decodeIntegerForKey:@"Lives"];
self.iRocksFallen = [unarchiver decodeIntegerForKey:@"RocksFallen"];
self.bGameCompleted = [unarchiver decodeBoolForKey:@"GameCompleted"];
self.bGameOver = [unarchiver decodeBoolForKey:@"GameOver"];

[unarchiver finishDecoding];
[data release];

这完全没问题:)

关于iPhone 序列号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com