2010-04-22 12 views
13

Estoy tratando de depurar una aplicación de iPhone en la que estoy trabajando, y la idea de agregar cincuenta declaraciones NSLog a los diversos archivos fuente me da muchos ánimos.¿Alguna forma de preguntar un método por su nombre?

Lo que me gustaría hacer es escribir un par de declaraciones, dicen

NSString *methodName = [self methodName]; 
NSLog(@"%@", methodName); 

que sólo puede pegar en cada método que necesito. ¿Hay alguna forma de hacer esto? ¿Hay alguna construcción de Objective-C para preguntar un método por su nombre? ¿O voy a tener que hacer esto de la manera difícil?

+0

Este es un duplicado exacto de http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 que tiene una respuesta más completa. – Ken

+0

@Ken Sé que es un retraso de 5 años, pero creo que su enlace es incorrecto. Debe apuntar a http://stackoverflow.com/questions/969130/how-to-print-out-the-method-name-and-line-number-and-conditionally-disable-nslog?lq=1 –

Respuesta

22

Probar NSLog(@"%s", __func__). Esto imprime una bonita descripción, como -[MyView drawRect:].

Esto también funciona con funciones. Es una característica del compilador.

+2

'__func__' es una función de idioma C99. Sus primos '__FUNCTION__' y' __PRETTY_FUNCTION__' son extensiones de lenguaje provistas por GCC y posiblemente otros compiladores. Las tres son, creo, extensiones del lenguaje C++. –

+0

Dup exacto de http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 – Ken

11

Uso: NSLog("%@", NSStringFromSelector(_cmd));

_cmd es una variable especial aprobada para todos los métodos al igual que self que es una referencia al selector que causó el método que se invoca (básicamente el nombre y la firma del método).

+1

'NSLog ("% s", _cmd); ' Un SEL es una cadena en C. – drawnonward

+6

@drawnonward sí lo es técnicamente, pero aún así es bueno usar las funciones de conversión adecuadas. –

+9

@drawnonward: Se implementa como uno, sí, pero se define como un tipo opaco. Apple es infame por intercambiar cosas así debajo de ti, así que úsalo tal como está documentado, independientemente de cómo se implemente. –

2

Esto es lo que quiere:

NSLog(@"%s", __PRETTY_FUNCTION__); 

Para obtener más información sobre el material de registro relacionado, lea las respuestas a esta pregunta: How to print out the method name and line number and conditionally disable NSLog?

+1

'__func__' hace lo mismo (en todas las Mac actuales Compiladores OS X) y C99 garantiza su existencia. Además, no use '% @', ya que tanto '__PRETTY_FUNCTION__' como' __func__' son cadenas C, no objetos NSString. –

+0

Gracias por señalar el% @ error (he solucionado el error ahora). ¿'__func__' devuelve lo mismo que' __PRETTY_FUNCTION__' para métodos Obj-C, funciones C y funciones C++? Pensé que '__PRETTY_FUNCTION__' daba más información para las funciones C, como nombres de parámetros o algo así. –

+0

Ambos identificadores tienen el mismo valor en los métodos de Objective-C ('- [MyClass selector]') y en las funciones C ('nameoffunc') en ambos GCC 4.2.1 y Clang. No probé C++, porque no sé C++ .. –

4

utilizo las siguientes macros con frecuencia:

#if DEBUG 
# define LOG(format, args ...) fprintf(stderr, format "\n", ## args) 
# ifdef __cplusplus 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __PRETTY_FUNCTION__, __FILE__, __LINE__, ## args) 
# else 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __func__, __FILE__, __LINE__, ## args) 
# endif 
#else 
# define LOG(format, args ...) 
# define ERR(format, args ...) 
#endif 

Si siempre quiso el nombre de la función, puede adaptarlos fácilmente según sea necesario.

Cuestiones relacionadas