3
私は、アーカイブ配列読み取るために、次のコードを持って次のコードクラッシュ
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if(temp && [temp isKindOfClass:[NSArray class]])
{
self.posts = [temp mutableCopy];
}
が配列に
-(void)savePostList
{
NSURL *tempURL = [[[ZZAppDelegate sharedAppDelegate] applicationCacheDirectory] URLByAppendingPathComponent:@"postCache.plist"];
[NSKeyedArchiver archiveRootObject:self.posts
toFile:[tempURL path]];
}
を保存することです一般的にすべてのものは、しかし、非常に、完璧に動作します特定の(現在未定の)状況では、アプリは起動時に例外を起してクラッシュを開始します。
-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x275900
私は全体を包む場合
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array/>
</plist>
:
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
は、それは非常に奇妙な(そして非常に空)に見えるデバイスからのplistを引き抜いた:
クラッシュは、実際にコールの内部で起こります@try/@catch句で、次にように「すべてがうまくある」:
@try {
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if(temp && [temp isKindOfClass:[NSArray class]])
{
self.posts = [temp mutableCopy];
if(self.posts)
{
[self precacheImages];
}
}
}
@catch (NSException *exception) {
// exception thrown - delete file
NSLog(@"An exception occurred reading file - deleting");
NSError * err;
if(![[NSFileManager defaultManager] removeItemAtPath:path error:&err])
{
NSLog(@"Error deleting file: %@", err);
}
}
私の質問は:誰もがこれを引き起こすだろうか任意のアイデアを持っていない(の.plistのように「空」である)、その後、ためにunarchiveObjectWithFileコールは例外を発生させます(スタックトレースはシステムライブラリの内部にあります)。
ナデシリアライズするより、このようなものになるでしょう - 私は例外がunarchiveObjectWithFileコール*内側*スローされたと述べたように。 –
ああ、間違っている、あなたはキー配列のアーカイバを使用してplistを非直列化するべきではない...編集 –
NSCodingをサポートする非プロパティリスト安全オブジェクトを使用しているので、アーカイブ/アーカイブ解除が正しい。質問は私が前に何度もやったように、「やる方法」ではありません。問題の根源は、コード化されたデータがどのように乱れ、unarchiveObjectWithFileがクラッシュするかです。私はアップルにバグレポートを提出しました。ファイルを含めてクラッシュさせてしまいました。 –