Objective-C はじめました

なんか良くわからないけど、iPadのアプリを作らなきゃいけないかもしれないと思ったので。
まず手始めにデバッグできなきゃ話にならないので、そのへんのことやってみた。

iOS のアプリでは NSLog っていう関数があるらしい。そいつでデバッグログを出力する。んで、Objective-C は C の仕様を継承しているらしいので、ifdef なんかでデバッグビルドとリリースビルドでログ出力を制御したりするといい感じ。
デバッグ時だけログを出力させたい - 日々是笑心
このへんを参考にした。

NSLog はこんな感じで使う。

NSLog(@"unko");
NSLog(@"%d", 100);

んで、いざこんなふうにNSStringを渡してみると、ランタイムエラーで落ちる。
なんでじゃー!!!

NSString *str = @"unko";
NSLog(str);

この時点でポインタとかよくしらないボクは、きっとお作法的な何かだろうなと思ったりしてた。
ネット上のエロい人達のナレッジを拝借すると、みんなこんな感じに書いてるみたいだ。

NSString *str = @"unko";
NSLog(@"%@", str);

なるほど、sprintf っぽい書き方しなきゃだめなのね。

・・・でもまてよ、@"%@" は文字列でしょ?リテラルと変数ってなんか違うのん?


んー・・・。その文字列を変数に格納してみる。

NSString *fmt = @"%@";
NSString *str = @"unko";
NSLog(fmt, str);

とおったー!
でもなんで?w

ちょっと書いてみる

NSString *str = @"unko";
NSLog(str, @"");

これが通る。えー・・・


NSString *str = @"unko";
NSLog(str, nil);

そして、これも通る。えー・・・・・・・。



どうやら、第一引数がリテラルじゃない場合は、フォーマットを探しちゃうらしい。んで、なんでもいいからとりあえず第二引数をとると、なんか通る。なんだかなー。ちょっと気持ち悪い。