2012年3月17日土曜日

methods named 'xxx' found

プログラムを組んでいると、「methods named 'xxx' found」という警告がいくつか出た。

直訳すると「xxxという名前のメソッドが複数見つかった」となろうが、
それならエラーになるはずではないか。


よくよく調べると、id型のクラスインスタンスに対してメソッドを発行しようとすると
発生する(ことがある)とわかった。

「例」
タッチイベントを処理する
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 NSTimeInterval tm=[[touches anyObject]timestamp]; // ここでmethods named 'timestamp' foundが発生する


}

touchesに実際に格納されるのはUITouchであるが、[touches anyobject]はid型で返す。
timestampという名前のメソッドは複数のクラスが持つので、
どれか解決できずに警告が出てしまう。

実行時にはNSSetの内容は決定しているので、[touches anyobject]のidが実際は何であるか、
この場合UITouchであることがわかっているのでtimestampを呼び出す先もわかる=実行時エラーはでないのである。

警告を回避するには
 NSTimeInterval tm=[(UITouch *)[touches anyObject]timestamp];
として型を確定してやればよい。ポインター型でキャストすることに注意。

Xcodeのエラーコードはわかりにくい(その上ドキュメントがない)ので困る。

0 件のコメント:

コメントを投稿