NSNotFoundにはまった。
最近Macを購入してiPhone開発に遅ればせながらチャレンジ。やっぱりMacは脳みそがとろけます。まずはMacVimの香り屋さんをセットアップして、気持ちいい環境にしてからXCodeじゃなくて、コマンドラインでObjective-Cのお勉強からスタートや。やっぱり、「素」の部分がわからんとね。
そして、初挑戦のObjective-Cです。なんかメッセージを投げるところとか、すごくオブジェクト指向くさくていいかんじやなぁ。生まれて初めてやけど、まずは写経や!!
というわけでさっぱり最初はわからんので写経しながら実行して、意味をしらべていく。ところが、初めての言語は写経でつまづくとつらいもの。
NSArray *array = [NSArray arrayWithObjects:@"abc", @"def", @"ghi", @"jkl", nil]; int objectIndex = [array indexOfObject:@"pqr"]; if (objectIndex == NSNotFound) { NSLog(@"'pqr' is not found.\n"); }
といったコードがあったが、このobjectIndex == NSNotFoundの部分が真にならない。
例えば
NSLog(@"index:%d/n", objectIndex); NSLog(@"NSNotFound:%d/", NSNotFound);
なんてデバッグログを入れても、どちらも-1がかえってくるので、意味不明だ。
というわけで、まともにマニュアルを見て調べると、単純にSnow Leopardから64bitの関係上、NSNotFoundの値が変わった模様。
だから、上記のプログラムは動かない。NSNotFound部分を単純に-1にしてあげれば動作する。NSNotFound定数の型と、
NSArrayのindexOfObjectの戻り値の型が違うというだけですわ。
NSLogが型の違いをよきにはからってくれていたから、ややこしく見えただけですな。
試しにサンプルを作ってみた。
#import <Foundation/Foundation.h> int main(void) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSArray *array = [NSArray arrayWithObjects:@"abc",@"def",@"ghi",nil]; int objectIndex = [array indexOfObject:@"pqr"]; int objectIndex2 = [array indexOfObject:@"ghi"]; printf("uint NSNotFound: %lu\n", NSNotFound); printf("uint index : %u\n", objectIndex); NSLog(@"NSNotFound :%d\n", NSNotFound); NSLog(@"objectIndex:%d\n", objectIndex); printf("int index : %d\n", objectIndex); printf("uint index2: %u\n", objectIndex2); printf("int index2: %d\n", objectIndex2); [pool drain]; }
こいつの実行結果は
$ gcc -o test nsnotfoudtest.m -framework Foundation $ ./test uint NSNotFound: 9223372036854775807 uint index : 4294967295 2010-02-18 22:43:36.396 test[430:903] NSNotFound :-1 2010-02-18 22:43:36.398 test[430:903] objectIndex:-1 int index : -1 uint index2: 2 int index2: 2
どうや、こんなダサイものにはまるとはダサイやろ。。。(笑)
まぁ、最初はこんなもの。私は「体感覚タイプ」もしくは「触覚系タイプ」と呼ばれる種類の人らしいから、
なんでもやってみないとわからない。最初からマニュアルよまない。
という人種らしい。エンジニアとしてはどうよと思うけど、コンサルには結構向いている様子だ。
こんなしょぼいわしでも、実際に「やってみる」ことで、だんだんステップアップしてくるはずだわ。
これがいつものパターンやわ。