忍者ブログ

[PR]

2024年03月19日
×

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

デバックのときだけコンソールに出力する(for Apple LLVM compiler)

2013年01月31日
以前に『デバックのときだけコンソールに出力する』という記事を書きました。その記事を書いたときはXcodeの標準コンパイラがGCCでしたが、今はコンパイラがApple LLVM compilerに変わっています。現状でもこの方法が使えるのか気になったので少し調べてみましたが、結論から言うと何も細かい設定をせずメソッドファイルに以下を追加するだけで使えます。

#ifdef DEBUG

#define NSLog_for_DEBUG NSLog

#else

#define NSLog_for_DEBUG //

#endif


理由はプロジェクトのBuild SettingsタブにあるPreprocessingセクションにあるPreprosessor Macrosの項目で、もとからDEBUG=1という設定がされているためです。そのため何もせずにメソッドに上記を追加しておいて、NSLogをNSLog_for_DEBUGに置換すれば、その出力に関してはデバックの時だけログ出力するようになります。以前のコンパイラの頃に使っていたプロジェクトファイルを変換した場合でもこの設定になると思われますので、その場合も特に問題なく使えると思います。
PR

デバッグのときだけコンソールに出力する

2009年03月16日
変数の内容確認のためにNSLogなどでコンソールに出力出来るのはとても便利です。ただ、リリース用のビルドをした時にこれらが残っていると、最終的にはAppStoreに並べたソフトが陰でログを吐きまくっているなどという事態が発生しかねません。開発をやっていない人が実機のコンソールを覗く事はあまり無いかもしれませんが、リリース用のビルドをする時にはこれらをコメントアウトしておくのが礼儀というものでしょう。とはいえ、いちいちコメントアウトしたり、それを解除したりするのは面倒なのでこの操作は自動化してしまいましょう。

まず、プロジェクトの情報を開きます。署名を切り替えたりするところです。そこの一番下までスクロールさせたところに、ユーザ定義というセクションがあります。構成をDebugに切り替えて、左下の歯車のマークをクリックして「ユーザ定義の設定を追加」を選んで行を追加します。そこで、追加された行の設定をGCC_PREPROCESSOR_DEFINITIONSに、値をDEBUGに変更します。次に自分がデバッグ時だけログを出したいメソッドファイルの頭に、以下のような行を挿入します。

#ifdef DEBUG

#define NSLog_for_DEBUG NSLog

#else

#define NSLog_for_DEBUG

#endif


これを入れておくと、これより下の部分に書いたNSLog_for_DEBUG(〜はDebugでビルドしたときだけNSLog(〜として機能し、Releaseでビルドした時には機能しません。このため、そのあとでReleaseからAppStore用の構成を作ったとしても、そちらでログ出力が行われる事もありません。プロジェクト全体をNSLog(で検索すれば、自動切り替えを行っていないところだけがピックアップできるので、それらの含まれているメソッドファイルにも上にある5行を挿入し置換を進めていけば、今までに作ったNSLog命令を全てデバッグ時のみ機能するように変更できます。こうしておけば、リリース版でログ出力をコメントアウトし忘れた、などといううっかりミスを無くせますし、コメントアウトをしたり戻したりといった手間もかからなくなります。エラーレポートがリリース版でも必要ならそこだけをNSLogのままにしておけば、リリース版でもログが出力される状態のままにできます。

追記
条件分岐をさせた上でログを出力しているため、それら条件分岐の部分もリリース版ではいらない部分になるという場合もあります。この場合は#ifdef DEBUGの行と#endifの行を直接メソッド内部に挿入し、リリースではいらなくなる部分をこの2行の間に入れます。こうすることでその部分がリリース用では無視されます。中括弧の数合わせが狂わないように挿入位置には十分注意しましょう。

キー値コーディングの落とし穴

2009年01月02日
キー値コーディングは一度概念を理解してしまうと、もの凄く便利です。現在製作中のアプリにおいてもそれこそ湯水のごとく多量に使っています。まあ、概念を理解して使いこなせるようになるまでが結構大変なんですけどね。そして厄介なことに、私にとってはデバックで問題の発見がしにくい原因となるものでもあります。理由はとても簡単です。キー値の部分はコードの中では単なる文字列なので、Xcodeの補完入力が行われません。そのため、キー値のスペルミスは全くチェックされないからです。

@"key"と書くべきところが@"Key"となっていても、その逆の場合でも、当たり前ですがXcodeは何も言ってくれません。自分が打ち間違いやら思い込み違いやら、その他諸々をしなければ良いだけなんですが、キーの値を英語にすると、複数形にしてsを付けたかどうかや大文字で始めたかそれとも小文字で始めたかなど、後から迷ったりします。そうすると存在するはずの値が拾われないなどという、とても発見が難しいバグが起きたりします。一文字違うだけでも違う値になるのは当たり前で、そうでなければ困るのですけどね。というわけで皆様、キーの値は確実に一貫性を持たせましょう。

ログ出力

2008年11月19日
コンソールにメッセージを出す方法はNSLogを使う方法と、fprintfを使う方法の2つが動きます。例えばプログラムで使用中の整数iの値を実行中に確認したい場合には、

NSLog(@"i= %d",i);
fprintf(stderr, "i =%d\n",i);

どちらかを挿入しておけばこの行を通過したときの整数iの値がコンソールに出力されます。NSLogを使った場合には自分で作った出力用文字列だけでなく、日時などの情報が挿入されます。また、NSLogでは出力後に自動的に改行されますが、fprintfでは自動で改行されません。
 | HOME |