iOSプログラミングの注意点 (その2

昨日がEXC_BAD_ACCESSだったので次はメモリリークだよねと思っていたのだが、タイムリーにやっかいなエラーが発生した(過去にもやったことがある)ので今回は別なテーマにする。

-.plistに注意

Xcodeのプロジェクトを作ると必ず"プロジェクト名-info.plist"というファイルが出来ている。これはiOSアプリケーションのバンドルを構成してアプリケーション全体で必要な設定や制限、パラメタを持っておりアプリケーションの実行には欠かせないものだ。(androidで言うところのマニフェストに相当する)

しかし、この.plist、前にも書いたことがあるが実のところ普通のXMLファイルであり簡単に編集できるがその逆に簡単に壊してしまいやすいので注意が必要だ。

例えば今日だが、シミュレータで調子良くデバッグしていたアプリケーションを実機で動かすと、エラーが出て起動することすらできない。

ログを見てみると以下のように出力されてはいるものの、原因がさっぱり分からない(アプリケーションの名前は伏せ字にしている)

> 
Oct 11 13:03:10 unknown com.apple.debugserver-64[272] <Warning>: debugserver-64 for armv6 Copyright (c) 2007-2009 Apple, Inc.  All Rights Reserved.
Oct 11 13:03:10 unknown com.apple.debugserver-64[272] <Warning>: Connecting to com.apple.debugserver service...
Oct 11 13:03:10 unknown com.apple.debugserver-64[272] <Warning>: 1 [0110/0303]: RNBRunLoopLaunchInferior DNBProcessLaunch() returned error: 'No such file or directory (/Users/kazz/Library/Developer/Xcode/DerivedData/*_****-btukilgiiornrzdxcnxxrymdxqbc/Build/Products/Debug-iphoneos/*_****.app/*_****)'
Oct 11 13:03:10 unknown com.apple.debugserver-64[272] <Warning>: error: failed to launch process (null): No such file or directory (/Users/kazz/Library/Developer/Xcode/DerivedData/*_****-btukilgiiornrzdxcnxxrymdxqbc/Build/Products/Debug-iphoneos/*_****.app/*_****)
Oct 11 13:03:10 unknown com.apple.debugserver-64[272] <Warning>: 2 [0110/1303]: error: ::read ( 4, 0x2ff919d4, 1024 ) => -1 err = Bad file descriptor (0x00000009)
Oct 11 13:03:11 unknown kernel[0] <Debug>: lockbot[266] Builtin profile: debugserver (sandbox)

手がかりになりそうなのは"Bad file descriptor"だが、この「ファイル記述子の不良」は様々な所で発生するのであまり役には立たない。(ソケット接続でもよく発生する)

で一つずつ怪しい所を潰していった所やっと判明した。プロジェクトの-info.plistに問題があったのである。

赤線をマークした所が問題の箇所だ。このセクションは"required device capabilities"ということでアプリケーションを実行するiOSデバイスに必要な能力を記述することになっているが、最初のエントリが空である。(これを記述したのは当然私だ)

この空のエントリのおかげで"Bad file descriptor"が発生していたのである。

plistは自動生成に任せてできるだけ修正しない。修正が必要な場合はできるだけXcodeを使いXMLを直接手で直すようなことは避けた方が良いだろう。
それにしても...これで数時間潰した...