Al liberar una aplicación para iPhone, si desactivo NSLog();
¿funcionará mejor?¿Debo desactivar NSLog antes de lanzar la aplicación?
Respuesta
Una forma de hacerlo es entrar en la configuración de compilación y de debajo de la configuración de depuración añadir un valor a "preprocesador macros" valor como:
DEBUG_MODE=1
Hacer Asegúrese de hacer esto solo para la configuración de depuración y no para las versiones Beta o Release. Luego, en un archivo de cabecera común que puede hacer algo como:
#ifdef DEBUG_MODE
#define DLog(s, ...) NSLog(@"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
#else
#define DLog(s, ...)
#endif
Ahora en lugar de NSLog
uso DLog
todas partes. Al probar y depurar, obtendrá mensajes de depuración. Cuando esté listo para lanzar una versión beta o final, todas esas líneas DLog
se vacían automáticamente y no se emite nada. De esta forma, no es necesario configurar manualmente las variables o los comentarios de NSLogs
. Escoger tu objetivo de compilación lo resuelve.
En Xcode 4.5 da una advertencia que dice: "La declaración implícita de la función 'DLog' no es válida en C99", así que esto no funciona. –
@SergiusGee: Obtiene la advertencia de declaración implícita si no se puede encontrar la declaración de la función, en cuyo caso cree que está intentando declararla. Asegúrese de que su clase tenga acceso al archivo de encabezado donde se declara esto. –
Id no cierra la sesión porque le roba la posibilidad de recibir mejores informes de errores de los usuarios. ¡use el registro asincrónico y logLevels para limitar el golpe de rendimiento a casi cero! (ver el leñador de cacao o el log4j de Java –
Sí, debe deshabilitarlo. Especialmente si estás tratando de maximizar la velocidad de tu código. NSLogging cosas a la izquierda y a la derecha contamina el registro del sistema que otros desarrolladores pueden estar tratando de excavar y puede tener un gran impacto en el código de velocidad crítica (bucles internos, etc.) accidentalmente dejé algunos mensajes de registro en una función recursiva una vez tiene que lanzar una actualización con un "aumento del 30% de velocidad" unas semanas más tarde ... ;-)
NSLog es lento y no se debe utilizar para compilaciones de versiones. Una simple macro como la de abajo lo desactivará junto con las afirmaciones que pueda tener, que también deberían deshabilitarse. En el caso menos común en el que desea instalar NSLog en una compilación de lanzamiento, simplemente llámelo directamente. No olvides agregar "-DNDEBUG" a tus configuraciones de compilación "other c flags".
#ifdef NDEBUG
#define MYLog(f, ...)
#else
#define MYLog(f, ...) NSLog(f, ## __VA_ARGS__)
#endif
Dentro configuración predeterminada actual del proyecto en Xcode, la macro NS_BLOCK_ASSERTIONS
se establecerá en 1 en versión de lanzamiento, y DEBUG=1
en la versión de depuración.
Por lo tanto, prefiero el siguiente método.
// NS_BLOCK_ASSERTIONS is defined by default, as shown in the screenshot above.
// Or, you can define yourself Flags in the `Other C Flags` -> `Release`.
#ifndef NS_BLOCK_ASSERTIONS
#define _DEBUG
#endif
#ifdef _DEBUG
// for debug mode
#define DLog(fmt,...) NSLog(@"%s " fmt, __FUNCTION, ##__VA_ARGS__)
... /// something extra
#else
// for release mode
#define DLog(fmt,...) /* throw it away */
... /// something extra
#endif
¿qué tal esto?
#ifndef DEBUG_MODE
fclose(stderr); // the simplest way to disable output from NSLog
#endif
esto deshabilita la salida, pero no guarda ningún tiempo de procesamiento, es decir, NSLog sigue siendo llamado y sus argumentos son analizados – dwery
Mi favorito personal es usar una macro variable.
#ifdef NDEBUG
#define NSLog(...) /* suppress NSLog when in release mode */
#endif
Casi todas las respuestas anteriores sugestionan una solución pero no explican el problema. Hice una búsqueda en google y encontré el motivo. Aquí está mi respuesta:
Sí, si comenta NSLog en su versión de lanzamiento, el rendimiento será mejor. Porque NSLog es bastante lento. ¿Por qué? NSLog hará dos cosas: 1) escribir mensajes de registro en Apple System Logging (ASL); 2) si la aplicación se ejecuta en xcode, también escribe en stderr.
El problema principal se encuentra en el primero. Para lograr seguridad de subprocesos, cada vez que se invoca NSLog, se abre una conexión al recurso ASL, se envía un mensaje y se cierra la conexión. La operación de conexión es muy costosa. Otra razón es que NSLog dedica algo de tiempo para registrar la marca de tiempo.
Referencia de here.
en el archivo PCH escribir esto antes #endif
#define NSLog() //
Todas las buenas respuestas, sin embargo, aquí hay otro pequeño truco se puede considerar el uso, sobre todo en las fases de desarrollo/pruebas de su aplicación.
También podría ser útil para el código de liberación de la aplicación también, si solo desea activar SU código de depuración, y no mensajes que puedan indicar problemas fuera del control directo de su código.
el truco
Puede desactivar NSLog por archivo .m simplemente incluyendo la línea de seguimiento en la parte superior del archivo .m:
#define NSLog(...)
(NOTA: do NO pon esto el archivo .h, solo el archivo .m!)
Esto solo m Akes el compilador evalúa NSLog()
al expandir su macro de preprocesador en su lugar. La macro no hace más que despojar a los argumentos.
si desea volver a encenderla de nuevo se puede utilizar siempre
#undef NSLog
Se podría, por ejemplo, acaba de prevenir a cabo las llamadas a NSLog en torno a un grupo particular de métodos haciendo algo como
#define NSLog(...)
-(void) myProblematicMethodThatSometimesNeedsDebugging {
...
}
#undef NSLog
Además de todas las personas que sabiamente comentaron que no llamar a NSLog()
en absoluto en la producción se ejecuta un poco más rápido, voy a agregar que:
Todas esas cadenas de salida NSLog()
son visibles para cualquiera que descargue su aplicación de la tienda y la ejecute con el dispositivo conectado a un mac ejecutando Xcode (a través de la ventana Organizador).
Según la información que registre (y especialmente si su aplicación se comunica con un servidor, autentica, etc.), esto puede ser un problema grave de seguridad.
gracias por la información - ¿está en el documento en alguna parte o acaba de descubrirse? ¿Todavía es cierto para imprimir en Swift? –
No recuerdo haber leído ningún documento tación. Acabo de instalar mi compilación archivada (el mismo archivo binario que envié a la tienda) en mi dispositivo y la conecté a Xcode. No tengo idea si es lo mismo para 'print()' de Swift, pero lo más probable es que sí. –
@NicolasMiari ¿Qué quiere decir con enchufado a Xcode? Cómo podemos conectar nuestro binario a Xcode, de hecho quiero intentar lo mismo. Así que por favor sugiera Gracias. – iDevAmit
Actualización para Xcode 5 & iOS 7
nota: para un Xcode 7 Swift 2.1 solución/para eliminar de impresión() declaraciones en una versión de lanzamiento, encontrar mi respuesta here.
Sí, debe eliminar cualquier declaración de NSLog en su código de versión, ya que solo ralentiza el código y no sirve para nada en una versión de lanzamiento. Afortunadamente, en Xcode 5 (iOS 7), es increíblemente simple eliminar todas las declaraciones de NSLog 'automáticamente' en versiones de lanzamiento. Entonces por qué no hacerlo.
los primeros 3 pasos a seguir, a continuación, una explicación
1) en su proyecto Xcode, localizar el archivo 'YourProjectName-prefix.pch' (normalmente se encuentra esta en el grupo de 'los archivos de apoyo', donde se encuentra el archivo de main.m
2) añadir estas 3 líneas al final del archivo '.pch':
#ifndef DEBUG
#define NSLog(...);
#endif
3) probar la diferencia entre su 'depuración' y 'liberación' versión. Una forma de hacerlo es a través de 'editar esquema' -> 'ejecutar nombre de la aplicación' -> debajo de la pestaña 'información' seleccione usando el cuadro desplegable entre la versión de depuración &. ¡En la versión de lanzamiento no verá ninguna salida NSLog en la consola de depuración!
¿Cómo funciona todo esto?
en primer lugar, uno debe saber que un preprocesador es relativamente "tonto", y simplemente actúa como un "sustituto de texto" antes de que se llame al compilador. Reemplaza todo lo que 'define' por lo que sigue a la declaración #define
.
#define NSLog(...);
Los (...)
significa 'nada' entre los paréntesis(). Tenga en cuenta también el ;
al final. Esto no es estrictamente necesario ya que el compilador optimizará esto, pero me gustaría ponerlo allí, ya que es más 'correcto'. Después de #define
no hay 'nada', por lo que el preprocesador lo reemplazará con 'nada', por lo que simplemente arrojará la línea completa, comenzando en NSLog...
hasta e incluyendo el ;
.
definir sentencias se pueden hacer condicional utilizando #ifdef
(si está definida) o #ifndef
(si no está definido)
Aquí escribimos #ifndef DEBUG
, que significa 'si el símbolo de depuración no está definido'. El #ifdef
o #ifndef
necesitan ser 'cerrada' con #endif
Xcode 5 define por defecto el símbolo 'debug' para nosotros cuando el modo de construcción es 'debug'. En 'lanzamiento' esto no está definido. puede verificar esto en la configuración de su proyecto, pestaña 'Configuración de compilación' -> desplácese hacia abajo a la sección 'Apple LLVM 5.0 - Preprocesamiento' -> macros de preprocesador. ¡Verás que el símbolo 'DEPURACIÓN' no está definido para versiones de lanzamiento!
finalmente, el archivo .pch es creado por Xcode automáticamente, y se incluye automáticamente en cada archivo fuente durante el tiempo de compilación. Por lo tanto, es como si hubiera puesto toda la cosa #define
en cada uno de sus archivos fuente.
Funcionó como el encanto! – Theodoros80
Gracias @Whasssaaahhh, funciona genial. ¡Tenga cuidado de evitar poner código en las instrucciones de registro! El preprocesador eliminará * las declaraciones completas de 'NSLog' sin tener en cuenta lo que está dentro. –
Si es un proyecto anterior que no tiene el indicador de depuración en las macros de preprocesador, es importante agregar "debug = 1" para el proyecto y no el destino – Priebe
var showDebugLogs = false;
func DLog(format: String, args: CVarArgType...) {
if showDebugLogs{
println(String(format: format, arguments: args))
}
}
Esto aceptará los argumentos adicionales también .. Sólo el valor del parámetro showDebugLogs a verdadero o falso, según su necesidad
Esto es bueno, pero todavía tiene el problema de toda la sobrecarga de llamadas y cualquier sobrecarga (y posibles efectos secundarios) al computar cualquier argumento pasado a la función 'Dlog'. –
- 1. ¿Qué debo verificar antes de lanzar una aplicación web?
- 2. NSLog en la aplicación enviada
- 3. ¿Cómo debo lanzar en VB.NET?
- 4. ¿Debo devolver nulo o lanzar una excepción?
- 5. ¿Debo removeTarget antes addTarget
- 6. ¿Cómo debo depurar con NSLog (@ "Dentro del simulador de iPhone")?
- 7. ¿Debo eliminar NSLogs al liberar mi aplicación
- 8. Desactivar Caché de la aplicación con manifiesto
- 9. Usando NSLog para la depuración
- 10. ¿Debo llamar a MessageDigest.reset() antes de usarlo?
- 11. ¿Debo aprender Swing antes de aprender JavaFx?
- 12. ¿Existe alguna manera fácil de "desactivar el registro" antes de liberar su aplicación en el mercado?
- 13. ¿Debo eliminar TestFlight antes de enviarme a la App Store?
- 14. Cómo deshacerse de la fecha y hora que aparece antes de cada instrucción NSLog en la consola
- 15. pregunta sobre la salida NSLog% i,% d
- 16. Desactivar multitáctil en mi aplicación
- 17. nslog de iPhone "EXC_BAD_ACCESS"
- 18. aplicación ClickOnce no se actualiza o lanzar
- 19. ¿Puedo lanzar una aplicación sin el dispositivo?
- 20. Cacao: Sandbox derecho a lanzar otra aplicación
- 21. ¿Debo solicitar permiso antes de enviar información de uso anónima?
- 22. nslog dejó de funcionar en xcode
- 23. iPhone/iPad: ¿Tiene muchas llamadas NSLog() que afecten el rendimiento o la memoria de la aplicación?
- 24. ¿Hay alguna manera de borrar la salida NSLog?
- 25. ¿Cómo desactivar el resaltado del ícono de la aplicación?
- 26. Desactivar/habilitar una opción del menú de la aplicación
- 27. Comportamiento extraño con NSLog
- 28. NSLog 10b que significa?
- 29. NSLog - Comportamiento extraño
- 30. NSLog codificación incorrecta
En mi proyecto actual utilizo [UALogger] (https: // GitHub. com/UrbanApps/UALogger). ** No inicia sesión en la producción **, si no lo solicita explícitamente. Y tiene otros beneficios con respecto al NSLog simple, como los niveles de gravedad (con * DEPURSE *, * INFO * y etc.) fuera de la caja. ¡Buen trabajo! –
Para responder a su pregunta sobre "¿funcionará mejor?" Sí, lo hace, pero el rendimiento que obtiene depende de la cantidad de 'NSLog()' que tenga en su aplicación. 'NSLog()' tarda tiempo en ejecutarse y agrega una sobrecarga adicional al tiempo de ejecución de su aplicación. De todos modos, si ayuda en el rendimiento con una simple macro de preprocesador DEBUG, entonces debemos deshabilitarla. – Scott