1

Я хочу создать класс-оболочку для некоторых методов Runtime Objective-C для более простого тестирования (stubbing и т. Д.), И я хотел бы знать, как я обрабатываю передачу переменные аргументы метода Objective-C для функции C.Передача списка аргументов переменных из Objective-C метода в C функции

Например, я хочу, чтобы обернуть функцию C со следующей функцией подписи:

id objc_msgSend(id theReceiver, SEL theSelector, ...) 

Я понимаю, что я могу использовать «...» оператор для метода Objective-C, но как я могу передать это функции С?

- (id)msgSend:(id)theReceiver selector:(SEL)theSelector, ... 
{ 
    return objc_msgSend(theReceiver, theSelector, ...) // <-- how to pass variable arguments? 
} 
+0

Дубликат спрашивает о способе передачи метода в список переменных аргументов, но ответы также применяются к этому вопросу. – rmaddy

+0

Хотя этот вопрос «похож» на другой вопрос, я не согласен, что это «дубликат». – 5StringRyan

ответ

2

Вы не можете. Вариадические аргументы не могут быть переданы. Самое близкое, что вы можете сделать, это найти вариант функции, который принимает va_list вместо вариационных аргументов, затем инициализирует va_list и передает его функции.

В прежние времена у objc_msgSend() была такая вспомогательная функция, которая называлась objc_msgSendv(). С тех пор он устарел и убрал. Но с этой функцией, вы можете сделать это:

- (id)sendMessageTo:(id)selfish selector:(SEL)sel, ... 
{ 
    va_list args; 
    va_start(args, sel); 
    id retVal = objc_msgSendv(selfish, sel, args); 
    va_end args; 
    return retVal; 
} 
+0

Bummer, это будет вторая полезная функция, которая устарела, что я столкнулся в прошлом месяце или около того. – 5StringRyan

+0

@ 5StringRyan Да, слишком плохо Apple удалила его :( –

+1

Это не так полезно, поскольку он работает только с методами, которые были объявлены как переменные, что очень мало. Т.е. вы не могли бы использовать это как общий механизм пересылки. – bbum

1

Вы не можете сделать это с помощью чистых C. Но для этого существует libffi, который (или был) использован Apple для языкового связывания. Я использовал его в своей структуре AOP. Он работает очень хорошо.