2011-11-12 5 views
2

ファイルをロードするのにUIDocumentを使用しています。私は今何が起こって、どのように私のアプリが動作するかを見るためにファイルを破損している。それはEXC_BAD_ACCESSでクラッシュし、私はこのようなシナリオをどのように処理すべきか考えていました。私はちょうど希望ファイルが壊れることはありませんか? UIDocument前の日では、NSEXCEPTIONに@tryと@catchを使用しましたが、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が無効なコンテンツオブジェクトを渡しているため、アーカイブ解除がクラッシュします。明らかに、私には、バグは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