2010-02-05 6 views
7

Estoy a punto de enviar mi primera aplicación de iPhone.¿Está bien enviar el archivo binario de la aplicación iPhone con las declaraciones NSLog?

He puesto muchas declaraciones NSLog para probar y depurar la aplicación.

Así que mi pregunta es "¿Está bien para mantener las declaraciones NSLog en el código fuente"

y no tengo duda de que si los estados NSLog ralentiza el tiempo total de ejecución o no.

gracias.

+1

Ver http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code – Vladimir

Respuesta

9

que utilizan todo el tiempo (que se encuentra en algún lugar):

// DLog is almost a drop-in replacement for NSLog to turn off logging for release build 
// 
// add -DDEBUG to OTHER_CFLAGS in the build user defined settings 
// 
// Usage: 
// 
// 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(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) do {} while (0) 
#endif 
// ALog always displays output regardless of the DEBUG setting 
#define ALog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 

El proyecto Three20 de Facebook tiene forma más compleja de depuración o registro.

+0

puede decir dónde lo ha encontrado para que yo pueda entenderlo mejor – harshalb

+0

Lo siento. Olvidé dónde está. Pero, el código fuente es lo suficientemente descriptivo. Puedes googlearlo Si pudiera encontrarlo, podrías. –

+1

Es de este blog - http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne

3

Las tres aplicaciones que tengo en la AppStore están cargados de NSLogs así que supongo que está bien ...

2

nunca he deshice de la mina :)

Algunas personas recomiendan macros condicionales de compilación/compilador para que pueda construir sin ningún NSLog, pero creo que es demasiado esfuerzo por muy poca recompensa.

Sin embargo, NSLogs ralentiza la aplicación (ligeramente) por lo que eliminaría los que están afectando directamente el rendimiento. Además, es posible que desee eliminar algunas depuración información de registro para ocultar cómo se ha implantado su aplicación, etc.

la esperanza de que es útil,

Sam

+0

Buena respuesta, pero no estoy seguro de la "Creo que es demasiado esfuerzo por muy poca recompensa". Una vez que haya hecho esto una vez, no es tan difícil implementarlo nuevamente (toma como máximo 5 minutos) cuando configura un nuevo proyecto. Personalmente, tengo un DebugLog definido que se compila condicionalmente en nada para las versiones de lanzamiento, dejándome NSLog para usar en cosas realmente importantes que me gustaría mostrar en los registros. – Kevin

+0

Según el número y el contenido de NSLogs, la ralentización puede ser considerable. Si registra la descripción de cada objeto en una tabla, es probable que observe un rendimiento de desplazamiento pobre. – FelixLam

+0

@KevinBlair - Muy cierto, pero tendría que escribir la macro y luego el equipo en el que estoy tendría que adoptar la macro - Estoy tomando el camino de la menor resistencia :) (Sería bueno si hubiera una macro predefinida integrada en cada nuevo proyecto) – deanWombourne

6

Una aplicación que estaba trabajando en perviously había muchos NSLogs vertido de depuración a la consola. Descubrimos que obstaculizaban el rendimiento drásticamente del iPhone 3G. El golpe de rendimiento fue notable en un 3GS, pero no tanto.

Mi consejo sería utilizar una macro de preprocesador y una definición de preprocesador de depuración para usar condicionalmente NSLogs en compilaciones de depuración pero no en versiones de lanzamiento.

1

Simplemente uso un int de singleton int "useDebugMode" establecido en 0 o 1 que está almacenado en userPrefs (plist). Y, dependiendo del UUID del iPhone, agrego un "Usar modo de depuración: activar/desactivar" alternar a la pantalla de configuración para que pueda solucionar problemas en el futuro con las versiones de producción. Esto me permite depurar problemas de datos (con XML descargado) si las personas se quejan de problemas con el programa en el futuro. entonces yo envuelvo todos los s "NSLog" y "s" printf en

if (useDebugLog == 1) 
{ 
    NSLog(@"debug statement"); 
} 

Esto funciona para mí ... Por supuesto, el:

if (useDebugLog == 1) 

hace que algunos sobrecarga que estoy dispuesto a tratar con.

0

No es un problema utilizar NSLog en Release. Pero si coloca datos valiosos en el registro, otro usuario (desarrollador) puede ver esos datos. Como un enlace de descarga, etc.

2

XCode4 ofrece una solución muy buena para esto: use puntos de interrupción. seleccione la acción 'registrar un mensaje' y configure val = @ val @ como el mensaje, luego marque la casilla 'continuar automáticamente después de evaluar las acciones'.

No se ajusta a todos los casos de uso, pero le da la ventaja de fácil 'inspección' de los valores y garantiza que no lo harán en un lanzamiento.

+0

parece una buena. Gracias . – harshalb

Cuestiones relacionadas