Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 存档/未存档NSMutableDictionary时出错_Ios_Objective C_Ios6_Nskeyedarchiver - Fatal编程技术网

Ios 存档/未存档NSMutableDictionary时出错

Ios 存档/未存档NSMutableDictionary时出错,ios,objective-c,ios6,nskeyedarchiver,Ios,Objective C,Ios6,Nskeyedarchiver,在我的应用程序中,我有一个名为matchDataDictionary的字典,我设置了以下内容: [[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary setObject:deck forKey:@"deck"]; 其中,deck是deck的一个实例: 然后,我尝试用以下内容测试归档/取消归档: 存档(这似乎有效): NSMutableData *newData = [[NSMutableData alloc] init]; N

在我的应用程序中,我有一个名为matchDataDictionary的字典,我设置了以下内容:

[[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary setObject:deck forKey:@"deck"];
其中,deck是deck的一个实例:

然后,我尝试用以下内容测试归档/取消归档:

存档(这似乎有效):

NSMutableData *newData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:newData];
[archiver encodeObject:[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary forKey:@"root"];
[archiver finishEncoding];

NSLog(@"Archived Data: %@", newData);
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];
NSMutableDictionary *matchDataDictionary = [unarchiver decodeObjectForKey:@"root"];
[unarchiver finishDecoding];

NSLog(@"Unarchived Data: %@", matchDataDictionary);
取消归档(不起作用):

NSMutableData *newData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:newData];
[archiver encodeObject:[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary forKey:@"root"];
[archiver finishEncoding];

NSLog(@"Archived Data: %@", newData);
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];
NSMutableDictionary *matchDataDictionary = [unarchiver decodeObjectForKey:@"root"];
[unarchiver finishDecoding];

NSLog(@"Unarchived Data: %@", matchDataDictionary);
对于如何有效归档并随后取消归档这些数据的任何指导,我将不胜感激。如果有帮助的话,这是一款使用GameKit框架的回合制游戏,因此我正在尝试准备通过当前比赛的matchData发送的用户动作

还有!如果您能给我提供任何建议,告诉我如何修改Deck编码以包含其“Tiles”数组,我将不胜感激

非常感谢


良信电器使用NSCoding协议。每个实体编码自己,然后解码自己。神奇的是,这是多么容易,随着应用程序的发展,人们可以将功能添加到对象图的新部分,而不需要知道任何关于归档器/未归档器或其格式的信息

我在GitHub上有一个开源项目,可以轻松地对JSON进行NSCoding/从JSON:

下面是我开发之前的一些代码(通过单元测试):


实例firstDish只是一个表示一盘食物的实体盘。

我是否执行了错误的NSCoding协议(在上述要点中)?我有initWithCoder和encodeWithCoder,但可能它们都错了。字典中的自定义对象应该符合
NSCoding协议
我想是这样的?实现了它的两个功能,并在头文件中添加了。要点:您的实现看起来不错,但我认为您不应该在archiver中欺骗树节点,查看我自己的一些代码……您没有对对象进行编码。您应该将日志语句放在encode/initWithCoder中。确定他们没有被调用。是的,它似乎中断了,并将我带到以下方面:在您的代码中,initWithCoder调用父级的init,尝试将其更改为
[self init]
如果我将其更改为(self=[self init]),我会遇到相同的问题