EXC_BAD_ACCESS シグナルを受信しました 質問する

EXC_BAD_ACCESS シグナルを受信しました 質問する

アプリケーションをデバイスに展開すると、プログラムは数サイクル後に次のエラーで終了します。

Program received signal: "EXC_BAD_ACCESS".

プログラムは iPhone シミュレーターで問題なく実行され、命令を 1 つずつ実行していく限りデバッグも実行もされます。再度実行するとすぐに信号がヒットしますEXC_BAD_ACCESS

この特定のケースでは、加速度計コードにエラーがありました。シミュレータ内では実行されないため、エラーは発生しませんでした。ただし、デバイスにデプロイされると実行されます。

この質問に対する回答のほとんどは一般的なEXC_BAD_ACCESSエラーに関するものなので、ここでは恐ろしい Bad Access エラー全般について取り上げることにします。

EXC_BAD_ACCESS通常、不正なメモリ アクセスの結果としてスローされます。詳細については、以下の回答を参照してください。

これまでにこのEXC_BAD_ACCESS信号に遭遇したことがありますか? また、どのように対処しましたか?

ベストアンサー1

あなたの説明から判断すると、メモリ管理に何らかのエラーがあるというのが最も可能性の高い説明ではないかと思います。iPhone 開発に数週間取り組んでいるとのことですが、Objective C 全般の経験があるかどうかは不明です。別のバックグラウンドをお持ちの場合は、メモリ管理のルールを本当に理解するまでに、特に意識しない限り、少し時間がかかるかもしれません。

覚えておいてください。割り当て関数 (通常は静的 alloc メソッドですが、他にもいくつかあります) またはコピー メソッドから取得したものはすべて、そのメモリも所有しており、完了したら解放する必要があります。

しかし、ファクトリ メソッド (例)を含むほぼすべてのものから何かが返された場合、[NSString stringWithFormat]自動解放参照が存在することになります。つまり、将来他のコードによって解放される可能性があります。そのため、直接の機能を超えて保持する必要がある場合は、保持することが重要です。保持しないと、エミュレータのテスト中にメモリが使用中に割り当てられたままになるか、解放されても偶然まだ有効である可能性がありますが、デバイスで実行しているときに解放されて不正アクセス エラーとして表示される可能性が高くなります。

これらの問題を追跡する最善の方法、そしてとにかく良いアイデアは (明らかな問題がない場合でも)、Instruments ツールで、特に Leaks オプションを使用してアプリを実行することです。

おすすめ記事