I am trying to make a catch-all proxy that takes any selector with any type of arguments and sends an RPC call down the wire. In this case, the signature of the method is not known because it can be created arbitrarily by the end user.
I see that the method signature requires supplying type encodings for each of the arguments. Is there a type encoding that signifies absolutely anything (pointer, int, everything else)? Otherwise, is there another way to accomplish this effect?
“sort of”, but not really… or, at least, not practically.
You can implement the method forwarding protocol such that unrecognized method calls will be wrapped up in an NSInvocation and then you could tear into the NSInvocation, but it really isn’t practical for a number of reasons.
First, it only really works for relatively simple argument types. The C ABI is such that complex arguments — structures, C++ objects, etc.. — can be encoded on the stack in wonky ways. In fact, they can be encoded in ways where there isn’t enough metadata to decode the frames.
Secondly, any kind of a system where “selectors can be created arbitrarily by the user” has a very distinct odor about it; an odor of “you are doing it the hard way”. Objective-C, while exceptionally dynamic, was really not designed to support this level of pure meta-object pattern.
As well, any such resulting system is going to be exceptionally fragile. What if the “arbitrary selector” happens to be, say, @selector(hash)?