gpt4 book ai didi

iPhone - 归档自定义对象数组

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:11 24 4
gpt4 key购买 nike

我已经尝试了几个小时,但我无法解决这个问题。

我正在制作一个保存未完成的国际象棋游戏的应用,因此我尝试将数组写入文件。

这就是数组,如果它有意义的话:

-NSMutableArray savedGames
--GameSave a
---NSMutableArray board;
----Piece a, b, c, etc.
-----some ints
---NSString whitePlayer, blackPlayer;
---int playerOnTop, turn;
--GameSave b
---NSMutableArray board;
----Piece a, b, c, etc.
-----some ints
---NSString whitePlayer, blackPlayer;
---int playerOnTop, turn;

等等

这些是我的 NSCoding 方法:

游戏存档.m

- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:whitePlayer forKey:@"whitePlayer"];
[coder encodeObject:blackPlayer forKey:@"blackPlayer"];
[coder encodeInt:playerOnTop forKey:@"playerOnTop"];
[coder encodeInt:turn forKey:@"turn"];
[coder encodeObject:board forKey:@"board"];
}

- (id)initWithCoder:(NSCoder *)coder {
self = [[GameSave alloc] init];
if (self != nil)
{
board = [coder decodeObjectForKey:@"board"];
whitePlayer = [coder decodeObjectForKey:@"whitePlayer"];
blackPlayer = [coder decodeObjectForKey:@"blackPlayer"];
playerOnTop = [coder decodeIntForKey:@"playerOnTop"];
turn = [coder decodeIntForKey:@"turn"];
}
return self;
}

一 block .m

- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeInt:color forKey:@"color"];
[coder encodeInt:piece forKey:@"piece"];
[coder encodeInt:row forKey:@"row"];
[coder encodeInt:column forKey:@"column"];
}

- (id)initWithCoder:(NSCoder *)coder {
self = [[Piece alloc] init];
if (self != nil)
{
color = [coder decodeIntForKey:@"color"];
piece = [coder decodeIntForKey:@"piece"];
row = [coder decodeIntForKey:@"row"];
column = [coder decodeIntForKey:@"column"];
}
return self;
}

这是尝试归档并保存到文件的代码:

- (void)saveGame {
ChessSaverAppDelegate *delegate = (ChessSaverAppDelegate *) [[UIApplication sharedApplication] delegate];
[[delegate gameSave] setBoard:board];

NSMutableArray *savedGames = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
if (savedGames == nil) {
[NSKeyedArchiver archiveRootObject:[delegate gameSave] toFile:[self dataFilePath]];
} else {
[savedGames addObject:[delegate gameSave]];
[NSKeyedArchiver archiveRootObject:savedGames toFile:[self dataFilePath]];
}
}

- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"gameSaves.plist"];
}

抱歉,问题出在这里:

设置了一些断点后,从-saveGame:
这一行之后到达错误 [NSKeyedArchiver archiveRootObject:savedGames toFile:[self dataFilePath]];

这是控制台中显示的内容:

2010-05-11 17:04:08.852 ChessSaver[62065:207] *** -[NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x3d3cd30
2010-05-11 17:04:08.891 ChessSaver[62065:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x3d3cd30'
2010-05-11 17:04:08.908 ChessSaver[62065:207] Stack: (
32339035,
31077641,
32720955,
32290422,
32143042,
238843,
25827,
238843,
564412,
342037,
238843,
606848,
17686,
2733061,
4646817,
2733061,
3140430,
3149167,
3144379,
2837983,
2746312,
2773089,
41684313,
32123776,
32119880,
41678357,
41678554,
2777007,
9884,
9738
)

如果重要的话,-saveGame 是从导航 Controller 中的 UIBarButton 调用的。

感谢任何帮助,谢谢。

最佳答案

这是错误的:

- (id)initWithCoder:(NSCoder *)coder {
self = [[Piece alloc] init];
if (self != nil)
{

initWithCoder: 被调用时,类的一个实例已经被分配。在您的代码中,您正在泄漏该实例。你应该这样做:

- (id)initWithCoder:(NSCoder *)coder {
self = [super init]; // or [self init] if needed
if (self != nil)
{

另外,当你解码一个对象时,你并不拥有它,所以你需要保留它。

board = [[coder decodeObjectForKey:@"board"] retain];

如果您不“了解”保留/释放规则,请立即学习它们,否则您将不断搬起石头砸自己的脚。

另外,您的saveGame 方法有几个问题。

  1. 如果 savedGames 为 nil,则您正在将对象而不是数组保存到文件中。这意味着在下一次运行时,未归档的对象将不是您期望的数组。
  2. 未归档的数组是不可变的。将类型声明为 NSMutableArray 并不重要,如果您归档一个可变数组,您将在取消归档时得到一个不可变数组。如果要修改未归档的数组,需要调用 mutableCopy

我不确定这个异常到底是什么,但解决了上述问题,它要么会消失,要么会变得更容易找到解决方案。

关于iPhone - 归档自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814316/

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