3

私が構築しているアプリの 1 つは、SQLite を使用して、サーバーからダウンロードしたデータを保存します。

アプリ自体はマルチスレッドを使用しているため、アプリが起動すると、アプリはバックグラウンドでデータをダウンロードし、同時にユーザーに UI を表示します。

この時点で、ユーザーはアプリの操作を開始し、テーブルの行をタップして詳細ページにドリルダウンできます。

テーブルの行をタップすると、多くの sqlite3_prepare_v2() 関数呼び出しのいずれかでアプリがクラッシュすることがあります。NSOperationQueue に対して複数の最大同時操作を許可すると、より頻繁に発生しました。ただし、同時操作の最大数を 1 に制限したため、このようなことはほとんどなくなりました。

アプリの起動時にデータベース接続を開き、アプリを終了する必要があるまで開いたままにしてから、接続を閉じます。

クラッシュするサンプル行は次のとおりです。

if(sqlite3_prepare_v2(objDatabase, [strGet cStringUsingEncoding:NSUTF8StringEncoding], -1, &stmtGet, NULL) == SQLITE_OK)
{
    ...
}

エラーはEXEC_BAD_ACCESSと言っています

アプリの実行 20 回に 1 回、または 30 回に 1 回のように、クラッシュします。つまり、私の SQL ステートメントは 99% の確率で機能します。

これまでにこれが起こった人はいますか?

4

2 に答える 2

3

私はこれと同じ問題を抱えていました。sqlite3_prepare_v2 命令へのすべての呼び出しを注意深く調べて、一致する sqlite3_finalize がそれらのそれぞれに対して呼び出されていることを確認してください。私の場合、sqlite3_finalize が呼び出されていない場所があり、次に sqlite3_prepare_v2 が呼び出されたときにクラッシュが発生しました。常にクラッシュするわけではなく、狂ったようにデバッグするのは困難です。このコメントがお役に立てば幸いです。

これらのアクションを NSLog に記録する sqlite3_prepare_v2 および sqlite3_finalize のスタブ関数を作成すると、本当に役立つ場合があります。これは、一致する呼び出しを確認するのに役立ちます。

于 2012-07-03T19:32:42.790 に答える
0

ゾンビ オブジェクトを有効にして、解放されたオブジェクトが原因で問題が発生していないかどうかを確認します。ゾンビを有効にすると、アプリがクラッシュした理由が通知されます。これは、メモリ管理が適切でない可能性があり、異なるスレッドでは、管理メソッドが適切に呼び出されない場合があります。

から ns ゾンビ オブジェクトを有効にする

製品>スキームの編集>ゾンビを有効にして、今すぐアプリをクラッシュさせてください

于 2012-05-03T09:02:36.830 に答える