iOSアプリ開発デバッグ入門者によるまとめ(Xcode 3.2.5の場合)
環境変数
Java脳にはジーザスッなくらい、Objective-cのエラーメッセージは不親切で、何もいわずにスッと落ちることなどよくある。「EXC_BAD_ACCESS」がでてくるならまだましなほうで、これをもうちょっと親切にするために、環境変数を追加する。
(1)TestDebugプロジェクトの場合、「実行可能ファイル」の下の「TestDebug」をダブルクリック
(2)「引数」をクリック
(3)「環境に設定される変数」に、以下を追加する。値はすべて「YES」
- NSZombieEnabled
- NSDeallocateZombies
- MallocScribble
- MallocGuardEdges
これでちょびーーーっと、親切になる。
ログ
NSLogというのがあるのだけど、これをそのまま使っているとそんなに便利じゃないし、リリース用に全部消去するとか大変なので、開発の間だけがんがんにログを出せるようにする。かつうっかりNSLogを書いていても、リリース用にはなきものにしてしまう。
Debugのプロジェクトの設定を編集する
プロジェクト=>プロジェクト設定を編集 で、「ビルド」で、構成「Debug」を選び、「プリプロセッサマクロ」に「DEBUG」を追加する。プラスをクリックして「DEBUG」とタイプすれば良い。cocos2dのテンプレからプロジェクトを作った場合は、「プリプロセッサマクロ」が横文字でちょっと違う場合もあるが、それっぽい単語を探す。
プロジェクト名_prefix.pchに追加する
このファイルはOther Sourcesの下にある。
#if DEBUG # define MyLog(fmt, ...) NSLog((@"%s[%d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define MyLog(...) # define NSLog( args... ) #endif
MyLog はNSLog以下だよ、みたいなもん。__PRETTY_FUNCTION__は関数やメソッド名がでてくる。__LINE__は行数。
また、全体はif文なので、「DEBUG」の時は、MyLog(引数) が、NSLogに引数やらほにゃらら足したものになって、DEBUGでないときは、MyLog も NSLog も何にもならないので、何も出ないということになる。
これらは「c言語 プリプロセッサ」をキーワードに、c言語を勉強が必要らしい。。むにゃむにゃ。。
使用例
- (void)hoge { NSLog(@"IN"); MyLog(@"IN"); }
MyLogってクラスでもないのに、いきなり書けるわけっすよ!
c知らずなJava脳には衝撃でつね。
実行するとコンソールに以下
2011-01-21 14:45:35.149 TestDebug[91125:207] IN 2011-01-21 14:45:35.151 TestDebug[91125:207] -[TestDebugViewController hoge][29] IN
1行目はNSLogで出した場合。自分で渡した文字列「IN」しかでてない。
2行目はMyLogで出した場合。自分で渡した文字列「IN」の前に、クラス名にメソッド名、行数がでてきてとてーも便利!
ログの出し方
入門者はやっぱりログっすよログ。
もーわけわからーんという場合は、メソッドの入り口にみんな「IN」とか書いたりw。気になる変数の中身は片っ端から書き出したり。しかし、Javaの人にとって面倒くさいかもしれないことの一つが、フォーマットがいるっていうこと。
数値とか
int num = 0; ・・・ DLog(@"数 num = %d",num);
文字は %@。
「NSLog フォーマット」でぐぐると色々でてくる。Appleのドキュメントももちろんあるらしい。
Java脳だと "数 num="+num だよね プラス記号で文字列足し算してしまうざんす。。。
Leaksの使い方もどき
実行=>パフォーマンスツールを使って実行=>Leaks で起動する。
Instrumentsが起動すると、AllocatonとLeaksの2つセットででてくるので、Leaksをクリックすると、Leaksの表示になる。
プラスマークをクリックすると、ドリルダウン。該当箇所のソースがでてくる。
iマークをおすと、ポップアップがでて、どういうメソッドをたどって呼ばれたかがわかる。