2011-12-27 9 views
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コールは例外を発生させます(スタックトレースはシステムライブラリの内部にあります)。

答えて

0

あなたは、コードのセクションにも達していなかったことをplistの

NSArray * someArray = [NSPropertyListSerialization dataFromPropertyList: [NSData dataWithContentsOfFile:path] format:NSPropertyListXMLFormat_v1_0 errorDescription:nil]; 
+0

ナデシリアライズするより、このようなものになるでしょう - 私は例外がunarchiveObjectWithFileコール*内側*スローされたと述べたように。 –

+0

ああ、間違っている、あなたはキー配列のアーカイバを使用してplistを非直列化するべきではない...編集 –

+0

NSCodingをサポートする非プロパティリスト安全オブジェクトを使用しているので、アーカイブ/アーカイブ解除が正しい。質問は私が前に何度もやったように、「やる方法」ではありません。問題の根源は、コード化されたデータがどのように乱れ、unarchiveObjectWithFileがクラッシュするかです。私はアップルにバグレポートを提出しました。ファイルを含めてクラッシュさせてしまいました。 –