IMP с неизвестным количеством параметров

Можно ли создать IMP, в котором количество параметров соответствует селектору для разрешаемого метода экземпляра?

Я мог бы использовать оператор «если» и конечное число параметров (скажем, от 0 до 10), но возможно ли иметь, например, IMP_implementationWithBlock с va_args?


person Jasper Blues    schedule 18.08.2013    source источник
comment
Судя по вашим недавним сообщениям, вы, возможно, попали на территорию, где хотите взглянуть на libffi, если вы еще этого не сделали. У меня есть два проекта на GitHub, которые используют libffi для таких вещей: WoolBlockInvocation и WoolDelegate. SO сообщает о них: В ObjC вы можете написать функцию, которая объединяет 2 блока?, Создание делегатов на месте с помощью блоков. Вы можете найти их интересными.   -  person jscs    schedule 18.08.2013
comment
Спасибо, Джош. . Я играл с аспектами libextobjc (на основе libffi), но столкнулся с некоторыми сбоями (реализация AOP этой библиотеки все еще экспериментальна). . . Итак, я примерно знаю, что может сделать libffi, но это пока мой опыт. Я проверю эти библиотеки и сообщения. . . любые другие ссылки/места для изучения также будут полезны.   -  person Jasper Blues    schedule 18.08.2013
comment
Передавать объекты в void * и из него может быть неудобно, особенно если вы хотите использовать ARC. У Майка Эша есть хорошая информация, как я упоминал ниже. Я почти уверен, что есть еще несколько ресурсов; позвольте мне попытаться выкопать их.   -  person jscs    schedule 18.08.2013


Ответы (1)


Вы не можете создать функцию во время выполнения в C; количество параметров должно быть известно во время компиляции.

Вы можете использовать функцию с переменным числом аргументов, чтобы представить, что у вас есть функция с любым количеством аргументов (я включил это использование в недавнем проекте), но это может быть не переносимым и, вероятно, имеет неопределенное поведение.

Если вам нужно переместить аргументы между функциями, где сигнатуры и аргументы неизвестны до времени выполнения, вы почти наверняка захотите заглянуть в libffi.

У Майка Эша есть несколько действительно полезных сообщений об этом: http://www.mikeash.com/pyblog/?tag=libffi я начал и узнал большую часть того, что знаю об этом.

person jscs    schedule 18.08.2013
comment
Обновление: больше не рекомендуется использовать функцию с переменным числом аргументов, так как в arm64 аргументы передаются непосредственно в регистры. Теперь мы используем метод «forwardInvocation». - person Jasper Blues; 24.05.2014