iPhoneアプリ開発のツボ “EXC_BAD_ACCESS”
ここのところ、iPhone向けアプリの開発が面白くって、ほぼ毎日、マックの前でプログラミングちう。
で、iPhoneアプリ開発の最初の頃に苦しんだのが、各種View Controllerの存在。とにかく、画面の制御に関して、アップルさんは懲りに凝っているので、正直理解するのが大変でした。しかも、いくつものビューを組み合わせると、それぞれのビューの間のデータ連携も一苦労でした。ふう。ま、そのあたりは、3ヶ月格闘した成果もあってか、随分と馴染むことができた感があります。
最近は、いろいろな機能を試しつつ、ちょっと高度?な技にも挑戦中なんですけど、少し慣れたころにハマるのがメモリ周りのエラー。とにかく、「プログラムはシグナルを受信しました : “EXC_BAD_ACCESS”。」っていうメッセージがデバッガコンソールに表示されると、その後、かなり面倒なデバッグ作業が待っていたりします。
ま、大抵は原因が分かるんですけど、なかには、どうにもこうにも理解不能なこともあって、そのあたりで時間を浪費することがままあったりします。でも、手探りでデバッグしていてもストレスが貯まるだけなので、何とかスマートなやり方がないかな?って調べてみたら、やっぱりありましたよ。
詳しいところは、”nsdebugenabled”というキーワードでググってもらうと分かるはずですが、xcodeの環境変数とやらに、
NSZombieEnable = YES
MallocStackLogging = YES
NSDebugEnabled = YES
って設定しておくと、プログラムが落ちた付近の詳しいログを記録してくれるようになりますし、
コンソールでshellコマンドを発行すると、運が良ければ、トレースした結果を表示することができるので、トレース結果のなかから、自分が使った、あるいは自分で組んだメソッドの名前を見つけると、かなりのヒントになったりします。でも、シミュレータじゃないとお目当てのログが記録できないみたい、ということと、そもそもデバッガが一緒に落ちちゃうとログが残らないこともあったりします。ま、その時は諦めるとして、とにかくログが残っているケースなら、かなり効率化が期待できそう。
iPhoneアプリの開発では、この手の共通した悩みをもっている方が多いんじゃないかと思ったので、今回はちょっと技術的なTALKをしてみました。ユーザの方々も、実はこんな苦労をしながらプログラムを作っている人たちがいる、っていうことを理解いただきつつ、アプリを愛用してもらえると嬉しかったりします。