首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSKeyedUnarchiver不调用initWithCoder

NSKeyedUnarchiver不调用initWithCoder
EN

Stack Overflow用户
提问于 2010-08-08 01:02:47
回答 3查看 2.7K关注 0票数 1

我使用了以下示例:

game state singleton cocos2d, initWithEncoder always returns null

我不使用文件,而是使用从NSUserDefaults获得的NSData对象。它不是null,而是包含我认为是正确编码的数据,并且由于某种原因,当我运行unarchiveObjectWithData时,它不会调用initWithCoder,因为我在第一行放了一个NSLog。

想法?

代码语言:javascript
复制
+ (void)loadState {
 @synchronized([AppStateManager class]) {
  if (!sharedAppStateManager) {
   [AppStateManager sharedManager];
  }

  NSUserDefaults *udefs = [NSUserDefaults standardUserDefaults];
  NSData *archivedData = [udefs objectForKey:@"AppState"];
  NSLog(@"going to unarchive");
  [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
  NSLog(@"unarchive complete");
 }
}

- (id)initWithCoder:(NSCoder *)decoder {
 NSLog(@"init coder");
 self = [super init];
 if (self != nil) {
  [self setUsername:[decoder decodeObjectWithKey:@"username"]];
 }

 return self;
}
EN

回答 3

Stack Overflow用户

发布于 2010-08-09 00:28:55

解决了。

在上面的链接中发布的示例使用allocWithZone方法通过"sharedInstance“初始化对象。如果对象存在,则返回nil。

NSKeyedUnarchiver尝试再次通过allocWithZone进行分配,由于该对象已经在早些时候用同样的方法进行了初始化,或者有时是在手动之前,解压程序会得到一个nil而不是一个分配的对象。

希望这对某些人有帮助。

票数 2
EN

Stack Overflow用户

发布于 2013-01-16 12:09:31

我不知道为什么,但在我这样做之后,我获得了归档的NSData (我认为它的内容无关紧要):

代码语言:javascript
复制
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData *encodedConfig = [userDefaults valueForKey:kConfiguration];

当我执行此操作时,它返回nil

代码语言:javascript
复制
NSArray *configs = [NSKeyedUnarchiver unarchiveObjectWithData:encodedConfig];

但当我执行此操作时,我得到了预期的、先前存档的对象数组。

代码语言:javascript
复制
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedConfig];
NSArray *configs = [unarchiver decodeObject];

我希望这两种方法的行为是相同的。我唯一的回应是避免unarchiveObjectWithData:

票数 2
EN

Stack Overflow用户

发布于 2011-07-18 22:26:32

这不是一个答案,而是我在尝试解决类似问题时发现的一些额外信息。我想我还处于菜鸟状态,所以这是我唯一能找到的为这篇文章做贡献的方式。

不管怎样..。非常感谢你在这里浏览了这个issue...especially:http://www.cocos2d-iphone.org/forum/topic/11327

当我从文件中解压一个可变数组时,我遇到了一个问题,它使用的是你想出的方法,在哪里它会切换到一个不可变的数组。

将返回的数组转换为可变版本也不起作用。我最终将objectsFromArray添加到我的可变数组中,这解决了我的问题。

成功:

代码语言:javascript
复制
[self.mutableArray addObjectsFromArray:[decoder decodeObjectForKey:@"MutableArray"]];

这两种方法都不起作用:

代码语言:javascript
复制
self.mutableArray = [decoder decodeObjectForKey:@"MutableArray"];

self.mutableArray = (NSMutableArray *)[decoder decodeObjectForKey:@"MutableArray"];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3431279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档