2

このコードスニペットは、現在アプリストアにあるiPadアプリからのものであり、ARCを使用して記述されています。コードはxCode4.4.1(4F1003)を使用して開発され、IOS Simulator 5.1(272.21)で正しく実行されます。最近xCode4.5とIOSSimulator6.0をインストールしましたが、sqlite3_openが目的のCコードに戻ると、EXC_BAD_ACCESS(code = 2、address = 0x200)が返されます。

sqlite3 *tempDatabase;

const char *sqlStatement = [s_DBEngineDBName UTF8String];
commandReturn = sqlite3_open(sqlStatement, &tempDatabase);  // open main db
if(commandReturn == SQLITE_OK) {
    // ...
}

以前に次のコマンドを使用してデータベースを開きましたが、新しい環境でも失敗します。

commandReturn = sqlite3_open([s_DBEngineDBName cStringUsingEncoding:NSStringEncodingConversionAllowLossy], &tempDatabase);  // open main db

上で述べたように、SQLiteコードをステップスルーすると、最後のreturnステートメントが実行されるまですべて期待どおりに機能します。objc_storeStrongが関与している理由について私は混乱しています。

4

1 に答える 1

1

インクルードファイルの前方宣言まで問題を追跡しました: @class sqlite3; sqlite3 は構造体であるため、これは明らかに間違っています。これにより、ARC がそれを参照カウントしようとし、それが例外を発生させていました。

この行を削除するとコンパイル エラーが発生しましたが、sqlite3 の使用の前にキーワード「struct」を付けることで簡単に解決できました。

より深く掘り下げて、実際にはそうではないのに、コンパイラーが sqlite3 をクラスと見なしていたことに気付いたので、あなたの提案に感謝します。

于 2012-09-25T14:55:03.867 に答える