2013-03-18 72 views
1

我將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是否正確保存:它確實。

回答

1

問題可能是名稱衝突。

Apple的Message.framework包含一個名爲Account的類。雖然您不會直接鏈接此私有框架,但可以從其他Apple框架間接加載它,例如MessageUI.framework。我可以想象你最近將這個框架添加到了你的項目中。這將是你的bug第一次發生的時候。

唯一的解決辦法是重命名Account類。在蘋果的框架中實際上有quite a lot of unprefixed classes,所以你反正should use a name prefix

而且你應該提交一個bug,如@ bbum here所建議的。

+0

是的,我認爲就是這樣。我添加了框架,從那以後它不再工作了 – user1734282 2013-03-18 16:44:16

相關問題