2010-11-08 13 views
6

Como programador más nuevo, descubrí la magia de NSlog y la utilizo en mi código. Ha sido extremadamente útil (junto con NSZombieEnabled) en la depuración.¿Hay un costo para usar NSLog liberalmente?

Puedo ver un golpe de rendimiento definido en el simulador mientras imprime todo esto. No creo que vea ningún golpe así en los dispositivos, pero no estoy seguro.

Entonces, ¿cuesta algo dejar todo NSLogs? ¿Está usando más memoria en el dispositivo? ¿O el compilador simplemente los ignora, al igual que los comentarios cuando compilo para un dispositivo?

EDIT:

Esto es lo que he implementado, por la sugerencia de rano.

En mi archivo App_Prefix.pch, añadí:

// DLog is almost a drop-in replacement for NSLog 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead  DLog(@"%@", aStringVariable); 
#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__); 

Y luego en mi Project Info inspector, para la configuración Debug , bajo el encabezado GCC 4.2 - Preprocessing, Agregué el valor DEBUG a la entrada superior llamada, Preprocessor Macros.

Funciona como un encanto - DLog salidas cuando construyo una versión Debug y ALog siempre salidas.

+0

Ver también [¿Es cierto que no se debe usar NSLog() en el código de producción?] (Http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use -nslog-on-production-code) –

Respuesta

7

NSLog seguramente es más caro que un simple printf pero es un poco más integrados en el marco de Objective-C y Cocoa.

Por cierto cuando usted está seriamente programación notará que es insuficiente para la mayoría de sus necesidades. Eche un vistazo a este article y sus referencias para tener una idea sobre cómo reemplazarlo de una manera inteligente.

De esta forma, también puede hacer que el compilador lo ignore cuando ya no sea útil (por ejemplo, cuando liberará su fragmento de código). En general, puede #ifdef llamar a una función de registro en el cálculo de bucles intensivos/secuencias de código.

+4

Solo quería publicar el mismo enlace. Especialmente el comentario 15 de Bill Hollings merece una ojeada –

+0

@fluchtpunkt, sí, ese jefe es útil. Aunque prefiero un nombre más corto para mi función de registro, algo así como 'DNSLog' y de esta manera puedo convertir fácilmente los anteriores – rano

0

NSLog no está implementado como una macro, por lo que definitivamente habrá un costo. Cuantificarlo y decidir si es importante es más difícil. La única forma segura de hacerlo es medir su propia aplicación.

0

Las respuestas anteriores están desactualizadas. Simplemente debe usar CocoaLumberjack es muy superior a NSLog y proporciona mucha más funcionalidad que las respuestas anteriores.