2011-06-18 15 views
0

したがって、一連のメソッドを配列に格納しようとしています(それが意味をなさない場合)。Objective-Cの関数ポインタの問題

void *pointer[3]; 
pointer[0] = &[self rotate]; 
pointer[1] = &[self move]; 
pointer[2] = &[self attack]; 
//... 

私がしようとしているのは、配列のオブジェクトの種類に基づいて、配列内のオブジェクトの型に基づいて、特定のメソッドが呼び出されます。そして、代わりに何か言ってif文の束有するので:

if ([[myArray objectAtIndex:0] type] == robot]) { 
    //Do what robots do... 
} 
else if (...) { 
} 
else { 
} 

そして、私はそれを作るために期待していたタイマーでこれを有するこのような何か:今

pointer[[[myArray objectAtIndex:0] type]]; //This should invoke the appropriate method stored in the pointer. 

上記のコードは(と言いますコードの最初のブロック):

単精度として必要な値は、 '&'です。

説明が必要な場合は、尋ねてください。

また、私が呼び出しているすべてのメソッドがvoid型であり、パラメータを持たないことを通知するだけです。

答えて

3

C関数への参照を渡す必要がある場合は関数ポインタを使用しますが、Objective-Cオブジェクトのメソッドで作業する場合は実際にselectorsSELの型を使用する必要があります。

あなたのコードは、のようになります。私はあなたのコードを実行している

SEL selectors[3]; 
selectors[0] = @selector(rotate); 
selectors[1] = @selector(move); 
selectors[2] = @selector(attack); 

... 

[self performSelector:selectors[n]]; 
+0

。セレクタ[3]ではなくセレクタ[3]でなければなりませんが、ありがとう! – Dair

+0

おっと、良いキャッチ。それは私がそれをテストせずにコピー - 過去の編集のために得るものです。一定。 – Jonah

5

&演算子を使用してObjective-C関数から関数ポインタを外すことはできません。

あなたはに見たいでしょう:

これらのいずれかは、あなたがやりたいことができます。あなたがそれに慣れていない場合は、セレクタ(@selectorコンパイラ指令とSELタイプ)を必ず読んでください(多くのことが必要な基本コンセプトです)。ブロックはかなり新しく(Mac OS X 10.6およびiOS 4以降で利用可能)、Mac OS XおよびiOSの旧バージョンでターゲット/セレクタ、NSInvocationまたはコールバック関数が必要だったところで、大量の作業を省くことができます。