signal SIGABRTの原因?

はじめに

今回のお題は、以前どうまずが投稿していた Objective-C 初心者あるあるトラブル対応 - Project Unknown をみて、SIGABRT関連の話題は面白いなーと思ったので筆を取りました。

というわけで、今回のお題はSIGABRT。

そもそもsignal SIGABRTって何よ?

バグとしか言いようが無いですね。 もうちょっと突っ込んで言うと、 シグナル(プロセル)が、abortする(中断する)事。 なので、原因は何?ってなると、色んなケースがあるので、特定するのは結構骨です。

ただ、もう3,4年iOS開発してきて、signal SIGABRTに陥るケースって大体似通って来ているので、その経験則を記載します。

その1 インターフェースビルダーとコードをOutlet引いたのに、そのOutletが外れてしまっているパターン

Objective-C 初心者あるあるトラブル対応 - Project Unknown でも書かれていますが、これが一番多いです。

なので、Outletを引いた際は、Xibをいじるとき、コードのOutletをいじる際はまず注意しましょう。

その2 配列で存在しない添字にアクセスしている。

signal SIGABRTの前で落ちるケースもありますが、これもなかなかあります。 原因を調査する際には、NSArray, NSDictionaryの前にもブレイクポイントを貼って確認してみましょう。

その3 オブジェクトが生成されていない

これは中々見つけるのがしんどいパターンです。 該当する処理を実行する際に、とあるオブジェクトが生成されているのが前提となっている場合、そのオブジェクトがnilだとsignal SIGABRTになったりします。

まぁ、そこの依存関係が無いようにクラス設計しろよって話かもですが、中々現実はうまいこと行きませんね。。。

その4 コード修正前の情報がキャッシュされてしまっている

特にリソース周りのxib等に多いです。 一回Outlet外して、build -> 再度接続 -> buildってやっても接続した事になっていない場合があります。 どうまずの記事にもありますが、一度Cleanすると治ったりします。


最後に

代表的なのは上記くらいでしょうか。 ほかは、CoreDataのFetchがキャッシュされているとか細かいのは沢山ありますが、 大体上記に集約されているかと思います。

written by ゆう@あんのうん