2011-11-12 31 views
2

我正在使用UIDocument加載文件。我現在損壞了一個文件,看看會發生什麼以及我的應用程序的行爲。它會因EXC_BAD_ACCESS而崩潰,我現在想知道我應該如何處理這種情況。我只是希望該文件將永遠不會損壞?在UIDocument之前的日子裏,我使用了@try和@catch作爲NSEXCEPTION,但這不適用於EXC_BAD_ACCESS。這是我會使用NSZOMBIE的情況嗎?據我瞭解其他帖子,NSZombie只用於調試目的,而不是真正應該依賴的東西。下面是代碼拋出一個EXC_BAD_ACCESS行,如果我敗壞我的數據:加載文件時抓取EXC_BAD_ACCESS的方法

-(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError { 

if (!_books) { 
     _books = [[NSMutableArray alloc] init]; 
    } 

     self.books = [NSKeyedUnarchiver unarchiveObjectWithData:contents]; // THIS WILL CRASH IF CONTENTS GOT CORRUPTED 

     if ([_delegate respondsToSelector:@selector(libraryDocumentUpdated:)]) { 
      [_delegate libraryDocumentUpdated:self]; 
     } 

     return YES; 
    } 

感謝您的任何建議。

+1

我遇到同樣的問題。 loadFromContents傳遞一個無效的內容對象,所以unarchive崩潰。顯然,對我來說,這個錯誤是在iCloud中,它不應該傳遞無效的對象,但它確實如此。 – pstoppani

回答

1

EXEC_BAD_ACCESS不是您捕獲的異常,它告訴您您正在訪問無效的內存地址,從而導致崩潰。 NSZombies只是一種保持應該被釋放的所有對象「活着」(因此不釋放他們佔用的內存,這不是你想要的在發佈版本中顯然),以便告訴你哪個「釋放」你是消息。你需要弄清楚爲什麼你要得到EXEC_BAD_ACCESS。書籍是保留財產嗎?

+0

是的,它是:@property(nonatomic,strong)NSArray * books;但是,我不明白爲什麼只有在我破壞數據的情況下才得到這個結果?我在上面的示例中省略了另一行代碼。我剛添加它 - 也許這就是原因。謝謝你的幫助! –

+0

哦,在主文件中我有:@synthesize books = _books;基本上就是這樣。 –

+1

你不應該有這條​​線_books = [[NSMutableArray alloc] init]; (它應該是self.books = [[NSMutableArray alloc] init]),你將重新分配它與unarchive無論如何,所以它沒有任何用途。 – jbat100