2013/01/08

iPhoneアプリの作成時にやっておきたいプロジェクトの設定

Xcode の操作方法は 4.5.2 のものです。

1. デバッグログ マクロ
プロジェクトのプリコンパイルヘッダ(.pch)に次のようなマクロを仕込みます。
#ifdef DEBUG
    #define LOG(...)     NSLog(__VA_ARGS__);
    #define LOG_METHOD   NSLog(@"%s", __func__);
    #define LOG_POINT(_x) NSLog(@"Point : %.3f,%.3f", _x.x, _x.y );
    #define LOG_SIZE(_x)  NSLog(@"Size : %.3f,%.3f", _x.width, _x.height );
    #define LOG_RECT(_x)  NSLog(@"Rect : %.3f,%.3f / %.3f,%.3f)", _x.origin.x, _x.origin.y, _x.size.width, _x.size.height);
#else
    // Disable Logging
    #define LOG(...) ;
    #define LOG_METHOD ;
    #define LOG_POINT(_x) ;
    #define LOG_SIZE(_x) ;
    #define LOG_RECT(_x) ;
#endif
見たまんまですが、これらのログマクロはデバッグビルド時のみで有効で、リリースビルド時にはログ出力コードは生成されません。リリース時には不要なデバッグ用の冗長なログ出力用です。
例外情報などのリリースビルド時にもログを出力する場合は、普通に NSLog を使います。

LOG_METHOD は呼び出しをトラッキングしたいメソッドの先頭に記述するマクロで、NSLog にいちいちメソッド名を記述する手間を省きます。
LOG_POINT, LOG_SIZE, LOG_RECT は CGPoint, CGSize, CGRect を読みやすい書式で出力します。(標準の書式だとデバッグコンソール上で読みづらいので)
他に LOG_COLOR みたいなのがあっても良いかもしれませんね。


2. ARC(Automatic Reference Counting)を使う場合は .m ファイルにおまじないを入れておこう
#if !__has_feature(objc_arc)
#error This code needs compiler option -fobjc-arc
#endif
ARC対応のソースはARCを無効にした状態でコンパイルしても普通にコンパイルが通ってしまいますが、当然ながらメモリリークを起こします。
ARCを前提としたプロジェクトを作成して、そのプロジェクト内だけでソースを使用しているうちは問題にはなりませんが、このソースを別のARC無効なプロジェクトで再利用しようとすると、うっかりメモリリークを起こしかねません。
このような事故を未然に防ぐために、上記のおまじないを組み込んでおくと安心です。


3. プロジェクト内でARCなソースと非ARCなソースを混在させる場合の設定
ことの発端はARCを有効にしたプロジェクトで InAppSettingsKit を使おうと思ったら、このソースがARC非対応であったために大量の "not available in automatic reference counting mode" というエラーが発生してプロジェクトがビルドできなかったという経験です。

ARCの有効/無効は、ソース毎にコンパイル時のオプション -fobjc-arc, -fno-objc-arc で指定します。
Xcode のプロジェクト設定でソース毎にコンパイルオプションを指定する事ができるため、ここで上記のオプションを個別に指定することでプロジェクト内にARC対応/非対応のソースを混在させることができます。

Xcode のナビゲータでプロジェクトを選択し、プロジェクトのTARGETを選択後に "Build Phases" を選択します。
"Build Phases" のペインに "Compile Sources" というセクションがあるので、該当するソースの "Compiler Flags" の欄をダブルクリックして上記のコンパイラオプションを指定します。
(Xcodeのペインが3分割の場合、コンパイラオプションを指定するための "Compiler Flags" のヘッダが右隅に追いやられて "C." としか表示されていなくて発見しにくいです)

最初の例の場合、ARCが有効なプロジェクトの中にARC非対応のソース(InAppSettingsKit)が混ざっているため、InAppSettingKit のソース全ての Compiler Flags に "-fno-objc-arc" を指定します。


4. TODOコメントを警告として出力する
プロジェクトの "Build Phase" で設定できます。
プロジェクト > ターゲット と選択したあとに "Build Phase" ペインを開きます。
ここの "Run Script" というセクションを設定しますが、デフォルトではこのセクションがないため、右下にある "+ Add Build Phase" をクリックして "Add Run Script" を選択します。
追加した "Run Script" セクションに以下のシェルスクリプトを記述します。
KEYWORDS="(TODO|FIXME|DEBUG):|\?\?\?:|\!\!\!:"
find ${SRCROOT} \( -name "*.h" -or -name "*.m" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | \
perl -p -e "s/($KEYWORDS)/ warning: \$1/"
※その他のフィールドはデフォルトのまま
すると、コンパイル時に TODO コメントを拾って警告として出力してくれます。
上記のスクリプトは出典のオリジナルに少し手を加え、 DEBUG: という記述も警告として出力するようにしています。

TODO コメントは Xcode のファンクションメニューでも確認できるのですが、コンパイル時に警告として出力しておく事で、常にプロジェクト全体の TODO コメントが把握できるのでわりと便利です。


【出典】
この情報は下記のブログを参考にしました。
これらの情報を公開していただいている Tomohiro Kumagai 氏、h_mori 氏に感謝します。