使用NSKeyUnarchiver加载数据时应用程序崩溃
问题描述:
我将NSKeyArchiver的帐户保存到文件中,但是当我尝试加载它们时,我的应用程序崩溃,说帐户没有实现initWithCoder:即使它的确如此,它也符合NSCoding:使用NSKeyUnarchiver加载数据时应用程序崩溃
-[Account initWithCoder:]: unrecognized selector sent to instance 0xa947a00
Account.m
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_name = [aDecoder decodeObjectForKey:@"name"];
_accessToken = [aDecoder decodeObjectForKey:@"accessToken"];
_refreshToken = [aDecoder decodeObjectForKey:@"refreshToken"];
_selected = [aDecoder decodeBoolForKey:@"selected"];
lastUpdate = [aDecoder decodeObjectForKey:@"lastUpdate"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_accessToken forKey:@"accessToken"];
[aCoder encodeObject:_refreshToken forKey:@"refreshToken"];
[aCoder encodeBool:_selected forKey:@"selected"];
[aCoder encodeObject:lastUpdate forKey:@"lastUpdate"];
}
AccountStore.m 在这里,我加载它们:
NSString *path = [[self archivePath] stringByAppendingPathComponent:@"accounts.archive"];
accounts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (!accounts) {
accounts = [[NSMutableArray alloc] init];
}
另外我应该提到,它已经工作,但从一秒钟到另一秒,它不再。我检查NSKeyedArchiver是否正确保存:它确实。
答
问题可能是名称冲突。
Apple的Message.framework包含一个名为Account
的类。虽然您不会直接链接此私有框架,但可以从其他Apple框架间接加载它,例如MessageUI.framework。我可以想象你最近将这个框架添加到了你的项目中。这将是你的bug第一次发生的时候。
唯一的解决办法是重命名Account
类。在苹果的框架中实际上有quite a lot of unprefixed classes,所以你反正should use a name prefix。
而且你应该提交一个bug,如@ bbum here所建议的。
是的,我认为就是这样。我添加了框架,从那以后它不再工作了 – user1734282 2013-03-18 16:44:16