¿Cómo imprimir el nombre del método y el número de línea y deshabilitar condicionalmente NSLog?
Estoy haciendo una presentación sobre depuración en Xcode y me gustaría obtener más información sobre el uso eficiente de NSLog.
En particular tengo dos preguntas:
- ¿Hay alguna manera de NSLog fácilmente el nombre/número de línea del método actual?
- ¿Hay alguna manera de "deshabilitar" todos los NSLogs fácilmente antes de compilar el código de lanzamiento?
Aquí hay algunas macros útiles sobre NSLog que uso mucho:
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
La macro DLog se utiliza para generar salida solo cuando la variable DEBUG está configurada (-DDEBUG en los indicadores C de los proyectos para la configuración de depuración).
ALog siempre generará texto (como el NSLog normal).
La salida (por ejemplo, ALog(@"Hello world")) tendrá este aspecto:
-[LibraryController awakeFromNib] [Line 364] Hello world
Tomé DLog
y ALog
de arriba y agregué ULog
lo que genera un UIAlertView
mensaje.
Para resumir:
DLog
saldrá comoNSLog
solo cuando la variable DEBUG esté configuradaALog
siempre saldrá comoNSLog
ULog
mostrará elUIAlertView
único cuando la variable DEBUG esté configurada
#ifdef DEPURACIÓN # define DLog(fmt, ...) NSLog((@"%s [Línea %d] "fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #demás # definir DLog(...) #terminara si #define ALog(fmt, ...) NSLog((@"%s [Línea %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #ifdef DEPURACIÓN # define ULog(fmt, ...) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] mensaje:[NSString stringWithFormat:fmt , ##__VA_ARGS__] delegado:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [mostrar alerta]; } #demás # definir ULog(...) #terminara si
Esto es lo que parece:
+1 Diederik
NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);
Muestra el nombre del archivo, el número de línea y el nombre de la función:
/proj/cocoa/cdcli/cdcli.m 121 managedObjectContext managedObjectContext
__FUNCTION__
en C++ muestra un nombre destrozado __PRETTY_FUNCTION__
muestra un bonito nombre de función, en cacao se ven iguales.
No estoy seguro de cuál es la forma correcta de desactivar NSLog, lo hice:
#define NSLog
Y no apareció ningún resultado de registro, sin embargo, no sé si esto tiene algún efecto secundario.