Ответ 1
В objc селектор не является указателем функции. Селектор - это уникальное целое число, которое сопоставляется с строкой в таблице поиска методов, хранящейся во время выполнения objc. В приведенном выше случае ваше имя метода будет myObjCSelector:
и для получения уникального селектора для него вы должны ввести @selector(myObjCSelector:)
. Однако это было бы бесполезно для вас, потому что оно не представляет собой конкретную реализацию функции.
То, что вы ищете, это IMP. См. этот вопрос SO.
ИЗМЕНИТЬ 2:
IMP myObjCSelectorPointer = (void (*)(id,SEL,int*))[self methodForSelector:@selector(myObjCSelector:)];
Затем вы можете вызвать метод, используя
myObjCSelectorPointer(self,@selector(myObjCSelector:),myIntArray);
Однако это означает, что вам нужно будет убедиться, что вы добавите указатель на себя в вызов функции c passObjCSelectorPointerToCContext. Таким образом, это должно выглядеть так.
passObjCSelectorPointerToCContext(cContextReference, self, myObjCSelectorPointer);
при вызове из объекта, содержащего метод.
Важно отметить, что использование IMP почти никогда не является правильной техникой. Вы должны попытаться придерживаться чистого Obj-C. Obj-C довольно эффективен после первого вызова сообщения, поскольку он использует временное кэширование.
РЕДАКТИРОВАТЬ 1:
Полезно понять, почему objc работает таким образом. Документы Apple подробно объясняют. Однако короткое объяснение выглядит следующим образом:
Когда вы отправляете сообщение объекту, например [myobject somemethod]
, компилятор не сразу узнает, какую конкретную реализацию вызова somemethod вызывать, потому что может быть несколько классов с несколькими переопределенными версиями somemethod. Все эти методы имеют один и тот же селектор, независимо от его аргументов и возвращаемых значений, и, следовательно, решение о том, какая реализация somemethod используется для запуска программы. [myobject somemethod]
преобразуется компилятором в вызов функции C:
objc_msgSend(myobject, @selector(somemethod))
Это специальная функция, которая ищет каждый макет класса myobject
, чтобы узнать, умеет ли этот класс отвечать на сообщение somemethod
. Если нет, то он ищет этого родителя класса и так далее до корня. Если ни один из классов не может ответить на somemethod
, то NSObject
определяет частный метод, называемый forward, где отправляются все неизвестные сообщения.
Предполагая, что класс может ответить на сообщение somemethod
, тогда он также будет иметь определенный указатель типа IMP, который указывает на фактическую реализацию метода. В этот момент будет вызываться метод.
Эта процедура значительно больше, чем я описал, но набросок должен быть достаточным, чтобы помочь вам понять, в чем состоит цель селектора.
Конечным моментом является то, что имена методов причины сопоставляются с уникальными целыми числами с помощью директивы @selector
, так что среда выполнения не должна тратить время на сопоставление строк.