Аргументы относятся практически к любому типу C, включая типы Objective-C, которые могут быть переданы методу. Таким образом, они не могут быть представлены в массиве.
Обратите внимание, что вызывать метод, который нигде не объявлен, не имеет никакого смысла. В частности, компилятор не имеет представления о том, как кодировать аргументы на сайте вызова, чтобы сделать правильный вызов функции C (вызов метода на самом деле является просто вызовом функции C для objc_msgSend()
или ее варианта). Итак, чтобы ответить на ваш вопрос «любой метод, даже если он не существует»; нет, ты не можешь этого сделать.
Однако вы можете эффективно исключить все предупреждения компилятора. Если вы исключите все предупреждения компилятора - все предупреждения типа «метод foo: bar: has not found» - тогда это означает, что компилятор имеет достаточно информации, и вы можете делать все, что захотите с прокси.
Кроме того (как я прочитал в вашем вопросе), нет необходимости реализовывать какие-либо методы на прокси. Прокси может с радостью пересылать вызовы NSInvocation любым вызовам методов. Правильно написанное, вы можете использовать прокси для любого объекта без проблем.
Что вам нужно сделать, это перечислить аргументы, используя API NSInvocation
, выяснить типы, а затем соответствующим образом декодировать каждый аргумент и распечатать соответствующим образом.
Количество аргументов можно получить, вызвав numberOfArguments
в сигнатуре метода экземпляра NSInvocation (подпись можно получить с помощью метода methodSignature
).
Затем переберите аргументы и вызовите getArgumentTypeAtIndex:
в сигнатуре метода, чтобы получить тип. Затем вы, скорее всего, напишите оператор switch()
в кодировке типов, чтобы затем вызвать getArgument:atIndex:
и декодировать соответствующим образом в зависимости от типа.
Обратите внимание, что аргумент 0 - это self, а аргумент 1 - _cmd; SEL метода, который был вызван.