2011-12-27 70 views
3

我有下面的代碼讀取存檔陣列:非常然而崩潰在unarchiveObjectWithFile特定條件下

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 

崩潰實際上是調用內部發生:

id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

說完掏出從它看起來非常奇怪的(而且很空)的設備的plist:

<?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> 

如果我包住整個事情在那麼@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崩潰。我已經向蘋果提交了一個錯誤報告,其中包括導致其崩潰的文件。 –