¿Cómo imprimir el nombre del método y el número de línea y deshabilitar condicionalmente NSLog?

Resuelto rein asked hace 15 años • 13 respuestas

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?
rein avatar Jun 09 '09 16:06 rein
Aceptado

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
diederikh avatar Jun 09 '2009 10:06 diederikh

Tomé DLogy ALogde arriba y agregué ULoglo que genera un UIAlertViewmensaje.

Para resumir:

  • DLogsaldrá como NSLogsolo cuando la variable DEBUG esté configurada
  • ALogsiempre saldrá comoNSLog
  • ULogmostrará el UIAlertViewú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:

Depurar UIAlertView

+1 Diederik

whitneyland avatar Aug 10 '2011 20:08 whitneyland
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.

stefanB avatar Jun 09 '2009 10:06 stefanB