我使用了以下示例:
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;
}发布于 2010-08-09 00:28:55
解决了。
在上面的链接中发布的示例使用allocWithZone方法通过"sharedInstance“初始化对象。如果对象存在,则返回nil。
NSKeyedUnarchiver尝试再次通过allocWithZone进行分配,由于该对象已经在早些时候用同样的方法进行了初始化,或者有时是在手动之前,解压程序会得到一个nil而不是一个分配的对象。
希望这对某些人有帮助。
发布于 2013-01-16 12:09:31
我不知道为什么,但在我这样做之后,我获得了归档的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:。
发布于 2011-07-18 22:26:32
这不是一个答案,而是我在尝试解决类似问题时发现的一些额外信息。我想我还处于菜鸟状态,所以这是我唯一能找到的为这篇文章做贡献的方式。
不管怎样..。非常感谢你在这里浏览了这个issue...especially: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"];https://stackoverflow.com/questions/3431279
复制相似问题