スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[iOS] iOS4で動いていたアプリがiOS5で原因不明の落ち方をして動作しないでござる

という標題通りのことがありまして。

急いでいる方に結論を先に書いておきますね。
iOS5 では iOS4 では見逃されていたしょうもないコーディングミスでアプリが落ちることがあるぞ!


はい。後はぐだぐだ書いていきますね。
冗長に書いていきますが、お悩みの方に何かヒントがあれば幸いです。
iOS4向けとして作成していたアプリを、前述のエントリのように
Webからインストールできるようにしておりまして、問題なく動いていたんですね。

参考:当ブログ内の別エントリ
[iOS] Distributing Enterprise Apps for iOS 4 Devices (iOS4 デバイスへのエンタープライズアプリケーションの配布)

で、端末を iOS5 にアップロードさせると起動したかと思うとすぐ終了したり、
起動しても PickerView を表示させようとした時点で落ちるように終了したり
していたのです。

また不思議なことに、端末を USBで接続して、Xcodeから起動させると問題なく
動作したりするのです。これが事象の概要です。

【事象】
iOS4 で問題なく動作していたアプリが iOS5 に更新した端末で動作しなくなった。
アプリを消して再度インストールしても同様。


で、いろいろ調べたり試行錯誤しておりました。
PickerView を表示しようとしたときに落ちることが多かったので、
修正ではなくゼロの状態から PickerView のみ配置した簡単な
アプリなどつくってみたら動作に問題はないわけです。

よくわからないので、再度ゼロから作り直していったらいいのかな? と思い
前のコードを拾えるところ拾いつつ勉強のつもりで再コーディング。
で、だいたい完成のところまで組み込んで、.ipa のファイルを作成して
FTPでアップして、端末からダウンロードしてインストール。
すると、以前と同じ事象が。 PickerView を表示しようとして落ちます。

と、いうことは 「以前のXCodeで作成したものがダメ」なのではなく、
「何らかの問題を内包していて、iOS4ではダマシダマシ動いていたものが
iOS5では終了するようになった」
と推測しました。

Xcode経由で動かしていても問題がないので、端末に何かログ的なものがあれば推測しやすいか?
と思い調べると、落ちたときのログが残っていました。
オーガナイザ(Xcode4.2であれば右肩の Organizer)を開いて、Device Logs を探してください。

参考:iOS開発ガイド - コンソール出力ログとデバイスログの表示
https://developer.apple.com/jp/devcenter/ios/library/documentation/Xcode/Conceptual/ios_development_workflow/#130-Debugging_Applications/debugging_applications.html

だいたいぱっとみてもよくわからないバイナリ情報が羅列してあるのですが、
運が良ければ問題のあるコードのファイル名と行数が載っています。

私の場合はそれがあり、PickerView を2列にしていて、2列目を selectRow() で値を
指定しようとして落ちているようでした。
ひとつの PickerView を numberOfComponentsInPickerView() 内で場合によって
1か2を返しており、1列にしたり2列にしたりしていたので、こういう使い方がいかんのかな?
とも思ったのですが、調べていくとそうでもないらしい。

ああでもないこうでもないといろいろ試して行き着いたのが、
titleForRow() で PickerView 内のドラムの要素を設定しているところ。

ざっくり書くと 0~6 を候補にすべく、こんなふうに書いておりました。

NSSTring* strArray[6] = { @"0", @"1", @"2", @"3", @"4", @"5", @"6" };

おかしなことしておりますね。配列は0から始まるので、strArray[7] でなくてはいけません。
でもこれでエラーも出ず、Xcode 経由の動作では問題がなかったのです。
おそらくは配列の7個目を Xcode 経由で動かすときは無理やり拡張してくれていたのでしょう。

これを正しく直すとあれ解決。
ですので、冒頭にも結論として書きましたが、Xcodeからのデバッグでは
エラーも吐かれず特に問題がないように見えても、
実機で動かすとおかしいことがあるぞ・・・ということです。

【原因】
コーディングミスにより、一定の添字数の配列よりあふれる形で値を与えていた。
iOS4 実機では問題なく動くものの、iOS5 実機では厳密にエラーとなり、
強制終了していた。


【解決の鍵】
オーガナイザから実機のログを参照して、問題のありそうな箇所を探る。
箇所がだいたい特定されたら、周囲のコードを見直す。

関連記事
スポンサーサイト

comment

管理者にだけメッセージを送る

検索フォーム
リンク
最新記事
最新コメント
カテゴリ
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。