NSTimer使ってNSInvocationのout of boundエラー(NSInvalidArgumentException)

結論から言うとNSTimerは関係なくて、何かのメソッドシグニチャが期待されているものと異なる場合にこういうエラーになることがあるみたい。

NSThreadを使っていたコードをNSTimerを使うように書き換えた時に書き換えていない部分でエラーが出たのでNSTimerが関係しているのかと思ったが違った。NSTimerを使っていない時にはたまたま正しく動いていたが、Invocationが2回行われるようになったことでたまたまあっていた何かがずれるようになったんだろう。まあNSInvocationのエラーが出たらまずはメソッドシグニチャを疑えば良さそうな感じ。



NSTimerを使ったらこういうエラーが出た:

2009-09-25 15:49:22.628 Camera[11838:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]'

ざっとググってみると「ハンドラのメソッドシグニチャが間違っているんじゃない?」と書いてあったがハンドラ(convert)のシグニチャは間違ってない。

- (void)convert:(NSTimer*)timer;

さっぱりわからんなぁ、と思いながらとりあえずどうしようもないのでconvertの中身をごっそりif(0)してみたらちゃんと動くようになってみた。とりあえずconvertの中身が悪いということでコメントアウトの範囲を変えながらどこが悪いか調べてみたら…

UIImageWriteToSavedPhotosAlbum(outputImage, self, @selector(finish_save_image), nil);

この1行をコメントアウトするとエラーが起きなくなることが判明。そしてfinish_save_imageのメソッドシグニチャが正しくなかった。
ドキュメントの要求するもの(http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIImageWriteToSavedPhotosAlbum)と異なっていた。解決。