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];
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow