2012-04-11 7 views
0

次のメソッドを呼び出した後、この例外が発生します。アプリが初めて読み込まれたときにのみ表示されます。私は再びアプリを開くときにうまく動作します。誰も助けることができますか?Exc_Bad_Access Iphoneでデータベースを作成する際の例外

-(void) createAndCheckDatabase 
{ 
    BOOL success; 

    self.databaseName = @"database.db"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDir = [documentPaths objectAtIndex:0]; 
    self.databasePath = [[documentDir stringByAppendingPathComponent:self.databaseName]retain]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    success = [fileManager fileExistsAtPath:self.databasePath]; 

    if(success) return; 

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName]; 

    NSError *err; 
    [fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil]; 
    if (err) { 
//  DebugLog(@"%@", [err description]); 
    } 

} 
+0

あなたは私たちにプロパティを貼り付けることができますか:self.databaseName?それは何ですか?保持しますか? –

+0

@ JonasSchnelliはいその保持 –

+0

これはメモリリークを作るようです: 'self.databasePath = [[documentDir stringByAppendingPathComponent:self.databaseName] retain];' 'retain'を削除します。しかし、クラッシュはそこから来るべきではありません。デバッガを使ってメソッドを実行しましたか?それはどこでクラッシュするのですか? –

答えて

2

エラーが初期化されていないため、(err)...がクラッシュします。 fileManagerのcopyItemAtPathには使用しないでください:

+0

初期化されていない手段がnilに設定されていませんか?この場合は –

+2

となります。 – Chakalaka

+1

ARCを使用している場合、エラーはnilに初期化されます。さもなければ、それは "未定義"であり、たぶんガーベッジ値になります。さらに悪いことに、デバッグビルドでは0になる可能性があり、シミュレータとデバイスの間で実行されるときには異なる値になる可能性があります。 –

1

EXEC_BAD_ACCESSほとんどの場合、ポインタまたはC配列を扱うバグを意味するか、オブジェクトが-であったことを意味します。

良いニュースは、デバッガ(Xcodeで実行している場合)にスタックトレースを持っているか、または何が間違っていたかを正確に示すクラッシュログがあることです。 (gatherreadのクラッシュログの仕方)。

「ゾンビ」音源でコードを「プロファイリング」することは、過剰なリリースに関する詳細情報を得る最も良い方法です。

象徴的なスタックトレースを投稿できる場合は、より良い診断を試みることができます。

関連する問題