NSKeyedUnarchiver不会调用initWithCoder

时间:2010-08-07 17:02:47

标签: objective-c cocoa

我使用了以下示例:

game state singleton cocos2d, initWithEncoder always returns null

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

想法?

+ (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;
}

3 个答案:

答案 0 :(得分:2)

解决。

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

NSKeyedUnarchiver尝试通过allocWithZone分配AGAIN,因为该对象早先已经在同一个方法中初始化了,或者有时候之前unarchiver获取的是nil而不是分配的对象。

希望这有助于某人。

答案 1 :(得分:2)

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

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData *encodedConfig = [userDefaults valueForKey:kConfiguration];

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

NSArray *configs = [NSKeyedUnarchiver unarchiveObjectWithData:encodedConfig];

但是当我执行此操作时,我会获得预期的,先前存档的对象数组。

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedConfig];
NSArray *configs = [unarchiver decodeObject];

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

答案 2 :(得分:0)

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

反正... 非常感谢你敲打这个问题......特别是在这里: http://www.cocos2d-iphone.org/forum/topic/11327

我遇到了一个使用你已经解决过的方法的可变数组的问题,在我从文件中取消归档后,它将切换到不可变数组。

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

曾为:

[self.mutableArray addObjectsFromArray:[decoder decodeObjectForKey:@"MutableArray"]];

这些都没有奏效:

self.mutableArray = [decoder decodeObjectForKey:@"MutableArray"];

self.mutableArray = (NSMutableArray *)[decoder decodeObjectForKey:@"MutableArray"];