Проблема с указателем на функцию в Objective-C - PullRequest
0 голосов
/ 19 июня 2011

Итак, я пытаюсь сохранить серию методов в массиве (если это имеет смысл).

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.

Прямо сейчас приведенный выше код говорит (самый первый блок кода):

L-значение требуется в качестве одинарного операнда '&'.

Если вам нужны какие-либо разъяснения, просто спросите.

Кроме того, просто чтобы вы знали, что все методы, которые я вызываю, имеют тип void и не имеют никаких параметров.

Ответы [ 2 ]

5 голосов
/ 19 июня 2011

Вы не можете просто сделать указатель на функцию из функции Objective-C, используя оператор &.

Вы захотите посмотреть:

Любой из них может делать то, что вы хотите,Обязательно читайте о селекторах (директива компилятора @selector и тип SEL), если вы не знакомы с этим (это базовая концепция, которая вам понадобится много).Блоки являются довольно новыми (доступны с Mac OS X 10.6 и iOS 4), и они сэкономят вам массу работы, когда вам понадобятся функции target / selector, NSInvocation или обратного вызова в более ранних версиях Mac OS X и iOS.

3 голосов
/ 19 июня 2011

Используйте указатели на функции, если вам нужно передавать ссылки на функции C, но при работе с методами на объектах Objective-C вам действительно следует использовать селекторы и тип SEL.

Ваш код будет выглядеть примерно так:

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

...

[self performSelector:selectors[n]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...