1

NSKeyArchiverを使用してアカウントをファイルに保存しましたが、それらを読み込もうとすると、アカウントがinitWithCoderを実装していないと言ってアプリがクラッシュします。実装されていてNSCodingにも準拠しています。

-[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];
}

また、それはすでに機能していましたが、1秒ごとにもう機能しませんでした。そして、NSKeyedArchiverが正しく保存されているかどうかを確認しました。保存されています。

4

1 に答える 1

1

問題は名前の衝突である可能性があります。

AppleのMessage.frameworkには、という名前のクラスが含まれていますAccount。このプライベートフレームワークを直接リンクすることは決してありませんが、MessageUI.frameworkなどの他のAppleフレームワークから間接的にロードすることができます。最近、このフレームワークをプロジェクトに追加したと思います。これは、バグが最初に発生したときです。

唯一の解決策は、Accountクラスの名前を変更することです。Appleのフレームワークには実際には接頭辞のないクラスがかなりたくさんあるので、とにかく名前の接頭辞を使用する必要があります。

そして、ここで@bbumによって提案されたように、バグを報告する必要があります。

于 2013-03-18T16:41:26.577 に答える