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マークをおすと、ポップアップがでて、どういうメソッドをたどって呼ばれたかがわかる。

まとめ

c言語知ってないとやっぱりあかんろかT_Tとさめざめ。

またXcodeはバージョンが変わると操作がすぐに微妙に変わったりするので、やり方と考え方は切り離して覚えておくのが良い。「環境変数に何か追加するとエラーが詳細にでてくるよ」「プリプロセッサとかプリプロセッサマクロとか、なんかあるらしいぜ」ということは、c言語などからつながる知識。それらをXcodeでは実際どこでどうやるのかは、Xcodeの操作の仕方の話。

実機でのテストは必須。
Java脳の人のためのメモリリーク対策指針
  • allocしてinitしたらどっかでリリースしないといけないという大原則。複雑なことをしていなければ、メモリリークはリリースしていない場合がほとんど。allocとinitでも、ほとんどautoreleaseつけといて、それじゃだめだという場合はつけない。
  • 使うクラスの初期化メソッドによっては、autoreleaseされるのがあるのでそこは確認
  • cocos2dの基本の初期化は「node」忘れるなあああ