Objective-C Language
Explotación florestal
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];
}