2009-09-03 8 views
42

Ejemplo: Tengo un método -myFooBarMethod:withFoo:bar:moreFoo: y dentro de la implementación de ese método quiero obtener dinámicamente su nombre, como @"-myFooBarMethod:withFoo:bar:moreFoo: en un NSString. No hay hard-typing de la firma del método.¿Cómo obtener el nombre o la firma del método actual en un NSString?

Creo que esto tiene que ver con los selectores. ¿Cómo podría obtener el nombre del método actual (el que ejecuta el código) como NSString?

Respuesta

94

Cada llamada al método también pasa dos argumentos ocultos: un id llamado self y un SEL llamado _cmd. Se puede utilizar para convertir NSStringFromSelector el selector de método a un NSString:

NSStringFromSelector(_cmd); 
+12

También puede usar la macro ** '__PRETTY_FUNCTION__' **, que el preprocesador reemplaza con una cadena C (char *) del nombre del método. También funciona para funciones C. –

+1

No sabía que había una macro llamada '__PRETTY_FUNCTION__'. Lo amo. Ahora solo tengo que encontrar una razón para usarlo en mi código en alguna parte ... – GeneralMike

1

De acuerdo con la respuesta de Martin, pero también al igual que para leer la información Objective C 2.0 Runtime.

Sin embargo, jugar en las entrañas como este tiende a llevar a código difícil de administrar.

+1

Hay momentos en que es válido, sin embargo. – Abizern

+0

Los propios Ejemplos de desarrollador de Apple lo usan para iniciar sesión de esta manera: 'NSLog (@"% @ received% @ ", self, NSStringFromSelector (_cmd));' –

7

Como un ejemplo de que este tipo de cosas es útil: Esto es una plantilla para los mensajes NSLog que utilizo:

NSLog(@"%@ %@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"A Message"); 

Esto vuelca la clase y el método para la consola al iniciar la sesión.

16

Use __func__. Esta es una cadena C, por lo que para un NSString, use [NSString stringWithUTF8String:__func__].

Esto tiene dos ventajas sobre _cmd:

  1. que funciona en funciones de C y métodos de C++, así como métodos de Objective-C. (De hecho, C99 requiere que exista __func__)
  2. En los métodos de Objective-C, incluye el tipo de método (método de clase vs. método de instancia) y el nombre de clase, así como el selector. Por ejemplo, "-[MyView drawRect:]".
Cuestiones relacionadas