1. ホーム
  2. アイオス

[解決済み】EXC_BAD_ACCESSシグナルを受信しました。

2022-03-30 21:56:56

質問

アプリケーションをデバイスにデプロイすると、数サイクル後に以下のエラーが出てプログラムが終了してしまいます。

Program received signal: "EXC_BAD_ACCESS".

iPhoneのシミュレータでは問題なく動作し、デバッグも手順を一つずつ踏んでいけば実行されます。また実行させるとすぐに EXC_BAD_ACCESS シグナルを送信します。

このケースでは、たまたま加速度センサーのコードにエラーがありました。シミュレータでは実行されず、そのためエラーは発生しませんでした。しかし、デバイスにデプロイされると実行されます。

この質問に対する回答のほとんどは、一般的な EXC_BAD_ACCESS というエラーが発生することがあります。そこで、恐ろしいBad Accessエラーのためのキャッチオールとして、これをオープンにしておきます。

EXC_BAD_ACCESS は、通常、不正なメモリアクセスの結果としてスローされます。より詳しい情報は、以下の回答で確認できます。

を使用することができます。 EXC_BAD_ACCESS シグナルにどのように対処しましたか?

どのように解決しましたか?

あなたの説明から、最も可能性の高い説明は、あなたのメモリ管理に何らかのエラーがあることだと思われます。iPhoneの開発に携わって数週間とのことですが、Objective C全般の経験があるかどうかはわかりません。もしあなたが他のバックグラウンドから来たのであれば、メモリ管理のルールを本当に理解するまでに少し時間がかかるかもしれません-あなたがそのことに大きなポイントを置かない限り。

アロケーション関数(通常は static alloc メソッドですが、他にもいくつかあります)やコピーメソッドから取得したものはすべて、自分もそのメモリを所有し、使い終わったら解放しなければならないことを覚えておいてください。

しかし、もしあなたが他のあらゆるものから何かを取り戻したなら、それは を含む ファクトリーメソッド (例: [NSString stringWithFormat] つまり、将来、他のコードによって解放される可能性があるということです。したがって、その機能を超えて保持する必要がある場合は、保持することが重要です。そうしないと、エミュレータでテストしている間はメモリが割り当てられたままになったり、解放されても偶然にまだ有効だったりしますが、デバイス上で実行すると解放されて不正アクセスエラーとして表示される可能性が高くなります。

これらの問題を追跡する最良の方法は、(たとえ明らかな問題がない場合でも)楽器ツールでアプリを実行することです(特にリークオプションを使用すること)。