メソッド屋のブログ

米マイクロソフト Software Development Engineer 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

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

どうや、こんなダサイものにはまるとはダサイやろ。。。(笑)


まぁ、最初はこんなもの。私は「体感覚タイプ」もしくは「触覚系タイプ」と呼ばれる種類の人らしいから、
なんでもやってみないとわからない。最初からマニュアルよまない。


という人種らしい。エンジニアとしてはどうよと思うけど、コンサルには結構向いている様子だ。


こんなしょぼいわしでも、実際に「やってみる」ことで、だんだんステップアップしてくるはずだわ。


これがいつものパターンやわ。