Objective-C Language
Registrazione
Ricerca…
Sintassi
- NSLog (@ "testo da registrare"); // Registro di testo di base
- NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Registrazione del testo compresi i numeri float.
- NSLog (@ "data:% i", myInteger); // Registrazione del testo compreso il numero intero.
- NSLog (@ "data:% @", myStringOrObject); // Registrazione del testo che fa riferimento a un'altra stringa oa qualsiasi oggetto derivato NSObject.
Osservazioni
Per la registrazione di vari tipi di oggetti e tipi di dati, fare riferimento a: Objective-C, Format Specifiers
Registrazione
NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);
Il primo argomento di NSLog
è un NSString
contenente il formato del messaggio di registro. Il resto dei parametri sono usati come valori da sostituire al posto degli specificatori di formato.
La formattazione funziona esattamente come printf
, ad eccezione dello specificatore di formato aggiuntivo %@
per un oggetto Objective-C arbitrario. Questo:
NSLog(@"%@", object);
è equivalente a:
NSLog(@"%s", [object description].UTF8String);
NSLog vs printf
NSLog(@"NSLog message");
printf("printf message\n");
Produzione:
2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message
NSLog
restituisce la data, l'ora, il nome del processo, l'ID del processo e l'ID del filetto in aggiunta al messaggio del registro. printf
emette solo il messaggio.
NSLog
richiede una NSString
e aggiunge automaticamente una nuova riga alla fine. printf
richiede una stringa C e non aggiunge automaticamente una nuova riga.
NSLog
invia l'output a stderr
, printf
invia l'output a stdout
.
Alcuni format-specifiers
in printf
vs NSLog
sono diversi. Ad esempio, quando si include una stringa nidificata, si verificano le seguenti differenze:
NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);
Formato di output NSLog
NSLog(@"NSLog message");
Il messaggio che viene stampato chiamando NSLog
ha il seguente formato quando visualizzato in Console.app:
Data | Tempo | Nome del programma | ID processo | ID discussione | Messaggio | |
---|---|---|---|---|---|---|
2016-07-16 | 08:58:04.681 | test | [46259 | : | 1244773] | NSLog message |
Registrazione dei valori variabili
Non dovresti chiamare NSLog
senza una stringa di formato letterale come questa:
NSLog(variable); // Dangerous code!
Se la variabile non è una NSString
, il programma si bloccherà, poiché NSLog
aspetta una NSString
.
Se la variabile è una NSString
, funzionerà a meno che la tua stringa non contenga un %
. NSLog
analizzerà la sequenza %
come un NSLog
formato e quindi leggerà un valore spazzatura fuori dallo stack, causando un arresto anomalo o addirittura l' esecuzione di codice arbitrario .
Invece, rendere sempre il primo argomento un identificatore di formato, come questo:
NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);
Il messaggio vuoto non viene stampato
Quando NSLog
viene richiesto di stampare una stringa vuota, omette completamente il log.
NSString *name = @"";
NSLog(@"%@", name); // Resolves to @""
Il codice sopra non stamperà nulla .
È buona prassi anteporre i log alle etichette:
NSString *name = @"";
NSLog(@"Name: %@", name); // Resolves to @"Name: "
Il codice sopra verrà stampato:
2016-07-21 14:20:28.623 App[87711:6153103] Name:
Rimozione di dichiarazioni di registro da build di rilascio
I messaggi stampati da NSLog
vengono visualizzati su Console.app anche nella build di rilascio della tua app, il che non ha senso per le stampe utili solo per il debug. Per risolvere questo problema, è possibile utilizzare questa macro per la registrazione di debug invece di NSLog
.
#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif
Usare:
NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!");
Nelle build di debug, DLog
chiamerà NSLog
. Nelle versioni di rilascio, DLog
non farà nulla.
Utilizzando __FUNCTION __
NSLog(@"%s %@",__FUNCTION__, @"etc etc");
Inserisce il nome della classe e del metodo nell'output:
2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc
NSLog e BOOL tipo
Non esiste un identificatore di formato per stampare il tipo booleano usando NSLog. Un modo per stampare il valore booleano è convertirlo in una stringa.
BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");
Produzione:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES
Un altro modo per stampare il valore booleano è di convertirlo in numero intero, ottenendo un output binario (1 = sì, 0 = no).
BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);
Produzione:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1
Registrazione dei metadati NSLog
NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);
Registra il file, il numero di riga e i dati della funzione insieme alle variabili che si desidera registrare. Questo può rendere le linee di log molto più lunghe, in particolare con nomi di file e metodi dettagliati, tuttavia può aiutare ad accelerare la diagnostica degli errori.
Puoi anche racchiuderlo in una Macro (memorizzarlo in un Singleton o dove ne avrai più bisogno);
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
Quindi, quando si desidera accedere, è sufficiente chiamare
ALog(@"name: %@", firstName);
Che ti darà qualcosa di simile;
-[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John
Registrazione accodandosi a un file
NSLog è buono, ma puoi anche accedere aggiungendo un file, usando codice come:
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];
}