objective C log método call

Posible duplicado:
¿Cómo pasar todos los arguments de un método a NSLog?

Puedo configurar una macro printCommand para registrar el receptor y el selector de una llamada de método de la siguiente manera:

#define printMethodCall NSLog (@"%@ %@", self, NSStringFromSelector(_cmd)); 

Pregunta: ¿puede ampliarse lo anterior para registrar todos los arguments que se pasaron con la llamada de método, sin importar cuán pocos o muchos, y cualquiera que sea el tipo, pueden ser?

Sí, puedes hacer esto, pero es bastante difícil.

El truco consiste en darse count de que un método es realmente solo una function y que puede crear una va_list partir de los arguments, incluso si el método / function no se declaró ... en la firma.

El pseudo código sería algo más o less así:

 va_list args; // start your argument list after the "_cmd" argument va_start(args, _cmd); // get the Method for this (instance) method Method thisMethod = class_getInstanceMethod([self class], _cmd); // get the type encoding string for this method const char *methodType = method_getTypeEncoding(thisMethod); // use the type encoding string to make an NSMethodSignature NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:methodType]; // iterate through all the arguments, skipping 0 (self) and 1 (_cmd) for (NSUInteger i = 2; i < [signature numberOfArguments]; ++i) { // get the type of the argument const char *type = [signature getArgumentTypeAtIndex:i]; // if this argument type is the same as an object, pull out an object if (strcmp(@encode(id), type) == 0) { id nextArg = va_arg(args, id); NSLog(@"object argument: %@", nextArg); // if this argument type is the same as a float, pull out a float } else if (strcmp(@encode(float), type) == 0) { float nextArg = va_arg(args, float); NSLog(@"float argument: %f", nextArg); } ... // repeat as necessary for all the types you care to log } // cleanup va_end(args); 

Afortunadamente , otras personas han deseado este tipo de cosas antes y han creado casi el mismo mecanismo para hacerlo. Aquí hay un ejemplo de algo que NSLog tendrá una expresión arbitraria:

http://vgable.com/blog/2010/08/19/the-most-useful-objective-c-code-ive-ever-written/