忍者ブログ

[PR]

2024年04月24日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

デバッグ中に急に動作が止まる場合に考えられること

2009年05月26日
デバッグ中に急にアプリケーションが反応しなくなった場合、コンソールに出力されるエラーメッセージでエラーの原因がわかる場合が多いです。でも、中にはよくわからないうちにホーム画面に戻ってしまっており、解決のヒントが少ない状態からエラーを探さなければならないこともあります。このような場合で自分が良く遭遇した原因は以下のようなものです。これからiPhone向けソフト開発で初めてObjective-Cに触れるという方の参考になるかもしれないので書き留めておきます。

1.別の画面にスクロールさせようとしたら止まる場合

多くの場合、InterfaceBuilder(以下IBと略します)でスクロール先のView関係の定義を忘れています。俗に紐付けといわれている、コード内の名称(IBOutletで宣言しているもの)とIB側にあるオブジェクトとの関連付けをするのを忘れている場合。nibファイルを作り忘れている場合や、その作ったファイルのクラス設定を忘れている場合などが原因として考えられます。

2.別の画面から戻ったら止まった場合

オブジェクトのメモリ管理ミスが多いです。例えば下の階層のビューへ設定用にオブジェクトを渡した場合、上の階層に戻る時に下のビューの表示が終わると、下のビューのコントローラーは(上の階層のビューコントローラーの変数にでもして組み込んでいなければ)開放されます。この時渡していたオブジェクトを間違って2重に開放してしまっていると、上の階層でそのオブジェクトにアクセスしようとした際に、既にオブジェクトが破棄されてしまっているためエラーになります。

3.時間のかかる処理をさせていて止まった場合

シミュレーターでは動くし、実機でもXcodeから起動させれば問題なく動くのに、実機単独では処理中に止まってホーム画面に戻ってしまうという場合です。数十秒かかるような処理の場合、実機単独の場合にはアプリが応答不能に陥ったと判断され、自動でホーム画面に戻る仕様となっています。起動直後の設定やデータ読み込みなどが複雑で時間がかかる場合などでは、起動させても止まってホーム画面に戻ってしまいます。Xcode経由で止まらないのは、デバッグではブレークポイントで長時間止めたままになることも有り得るため、それらの時間制限が無効化されているからです。あまりに処理時間がかかるような処理は、間にユーザーの応答をさせつつ実行してゆくようにする必要があります。起動後のほうが少し判定間隔が長いようなので、時間のかかる処理は起動時ではなく起動後にするようにするようにしたほうが安全かもしれません。

 2009.06.06追記

時間のかかる処理に関してはNSTimerを使う事で強制終了を回避できる場合があります。ただ、これは処理を細分化してループ化可能な場合に限定されます。例えばコード1行で行うような処理で時間がかかる場合には、NSTimerを使った回避はできません。具体的なNSTimerの使い方についてはいずれ記事にしようとは思っていますが、インターネット上を検索してもそれなりには情報が手に入ると思います。
PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Trackback
トラックバックURL: