我使用了以下示例:
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;
}
答案 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"];