Buscar..


Sintaxis

  • NSLog (@ "text to log"); // Registro de texto básico
  • NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Registro de texto incluyendo números flotantes.
  • NSLog (@ "data:% i", myInteger); // Registro de texto incluyendo número entero.
  • NSLog (@ "data:% @", myStringOrObject); // Registro de texto que hace referencia a otra cadena o cualquier objeto derivado de NSObject.

Observaciones

Para registrar diversos tipos de objetos y tipos de datos, consulte: Objective-C, Especificadores de formato

Explotación florestal

NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);

El primer argumento de NSLog es un NSString contiene el formato de mensaje de registro. El resto de los parámetros se utilizan como valores para sustituir en lugar de los especificadores de formato.

El formato funciona exactamente igual que printf , excepto por el especificador de formato adicional %@ para un objeto Objective-C arbitrario. Esta:

NSLog(@"%@", object);

es equivalente a:

NSLog(@"%s", [object description].UTF8String);

NSLog vs printf

NSLog(@"NSLog message");
printf("printf message\n");

Salida:

2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message

NSLog genera la fecha, la hora, el nombre del proceso, la ID del proceso y la ID del hilo, además del mensaje de registro. printf acaba de enviar el mensaje.

NSLog requiere una NSString y agrega automáticamente una nueva línea al final. printf requiere una cadena C y no agrega automáticamente una nueva línea.

NSLog envía la salida a stderr , printf envía la salida a la salida stdout .


Algunos format-specifiers en printf vs NSLog son diferentes. Por ejemplo, cuando se incluye una cadena anidada, se producen las siguientes diferencias:

NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);

Formato de salida NSLog

NSLog(@"NSLog message");

El mensaje que se imprime al llamar a NSLog tiene el siguiente formato cuando se ve en Console.app:

Fecha Hora Nombre del programa Identificacion de proceso ID de hilo Mensaje
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

Registro de valores variables

No deberías llamar a NSLog sin una cadena de formato literal como esta:

NSLog(variable);    // Dangerous code!

Si la variable no es una NSString , el programa se bloqueará, porque NSLog espera una NSString .

Si la variable es una NSString , funcionará a menos que su cadena contenga un % . NSLog analizará la secuencia % como un especificador de formato y luego leerá un valor de basura de la pila, causando un bloqueo o incluso ejecutando código arbitrario .

En su lugar, siempre haga que el primer argumento sea un especificador de formato, como este:

NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);

El mensaje vacío no se imprime

Cuando se le pide a NSLog que imprima una cadena vacía, omite el registro por completo.

NSString *name = @"";
NSLog(@"%@", name);  // Resolves to @""

El código anterior no imprimirá nada .

Es una buena práctica prefijar los registros con etiquetas:

NSString *name = @"";
NSLog(@"Name: %@", name);  // Resolves to @"Name: "

El código de arriba se imprimirá:

2016-07-21 14:20:28.623 App[87711:6153103] Name: 

Eliminar declaraciones de registro de versiones de lanzamiento

Los mensajes impresos desde NSLog se muestran en Console.app incluso en la versión de lanzamiento de su aplicación, lo que no tiene sentido para las impresiones que solo son útiles para la depuración. Para solucionar esto, puede usar esta macro para el registro de depuración en lugar de NSLog .

#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif

Usar:

NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!"); 

En las versiones de depuración, DLog llamará NSLog . En las versiones de lanzamiento, DLog no hará nada.

Usando __FUNCION __

NSLog(@"%s %@",__FUNCTION__, @"etc etc");

Inserta la clase y el nombre del método en la salida:

2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc

Tipo NSLog y BOOL

No hay un especificador de formato para imprimir tipo booleano utilizando NSLog. Una forma de imprimir un valor booleano es convertirlo en una cadena.

BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");

Salida:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES

Otra forma de imprimir un valor booleano es convertirlo en entero, logrando una salida binaria (1 = sí, 0 = no).

BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);

Salida:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1

Registro de metadatos NSLog

NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);

Registrará el archivo, el número de línea y los datos de la función junto con cualquier variable que desee registrar. Esto puede hacer que las líneas de registro sean más largas, particularmente con nombres de archivos y métodos detallados, sin embargo, puede ayudar a acelerar el diagnóstico de errores.

También puede envolver esto en una Macro (guárdela en un Singleton o donde más la necesite);

#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

Luego, cuando desee iniciar sesión, simplemente llame

ALog(@"name: %@", firstName);

Lo que te dará algo como;

 -[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John

Iniciar sesión agregando a un archivo

NSLog es bueno, pero también puede iniciar sesión agregando un archivo en su lugar, utilizando un código como:

NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
    [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
    fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( fh ) {
    @try {
        [fh seekToEndOfFile];
        [fh writeData:[self dataUsingEncoding:enc]];
    }
    @catch (...) {
    }
    [fh closeFile];
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow