В объекте селектор не является указателем на функцию. Селектор - это уникальное целое число, которое отображается на строку в таблице поиска методов, хранящейся во время выполнения objc. В приведенном выше случае имя вашего метода будет myObjCSelector:
, и чтобы получить уникальный селектор для него, вы наберете @selector(myObjCSelector:)
. Однако это бесполезно для вас, потому что оно не представляет конкретную реализацию функции.
То, что вы ищете, это IMP. См. этот ТАК вопрос.
РЕДАКТИРОВАТЬ 2:
IMP myObjCSelectorPointer = (void (*)(id,SEL,int*))[self methodForSelector:@selector(myObjCSelector:)];
Затем вы можете вызвать метод, используя
myObjCSelectorPointer(self,@selector(myObjCSelector:),myIntArray);
Однако это означает, что вам нужно убедиться, что вы добавили указатель на self в вызове функции 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
определяет приватный метод, вызываемый вперед, куда отправляются все неизвестные сообщения.
Предполагая, что класс может ответить на сообщение somemethod
, он также будет иметь определенный указатель типа IMP, указывающий на фактическую реализацию метода. В этот момент будет вызван метод.
В этой процедуре гораздо больше, чем я описал, но схемы должно быть достаточно, чтобы помочь вам понять, какова цель селектора.
И последнее замечание: имена методов причины сопоставляются с уникальными целыми числами с помощью директивы @selector
, чтобы среда выполнения не тратила время на сравнение строк.