iOS/Objective-C開発でクラッシュする原因まとめ

Objective-Cで書いたアプリがクラッシュする事例は、ARCの登場により幾分減りましたが、Objective-CやCocoa Touchフレームワークの特性を理解しないまま開発を行うと、まれに例外やBAD_ACCESSによるクラッシュが発生してしまいます。

原因

NSArrayやNSDictionaryにnilを追加してしまう

NSArray *ary = @[textField.stringValue]; // クラッシュ

上記のコードは実行環境によっては例外が発生してしまいます。実機ではクラッシュしてしまうこともありました。UITextFieldのstringValueプロパティは、オブジェクトの生成方法によっては初期値がnilになることがあるため、必ずNULLチェックを行う必要があります。シミュレータ上では初期値が空文字でも実機ではnilになるなんてこともよくあります。

対応方法として、nilになる可能性のある変数やメソッドの結果をNSArrayやNSDictionaryに渡す際には、三項演算子によるバリデーションを行いましょう。

NSArray *ary = @[self.textField.stringValue ?: @""];

NSTimerの停止忘れ

invalidateされずに残ったNSTimerが解放済みオブジェクトを呼び出してしまう場合があります。起動中のタイマーが残っている場合は手動でinvalidateしましょう。viewWillDisappearやviewDidDisappearが呼ばれるタイミングで停止するようにすると良いでしょう。

広告