Suche…


Syntax

  • NSLog (@ "zu protokollierender Text"); // Grundlegendes Textprotokoll
  • NSLog (@ "data:% f -% .2f", myFloat, ein andererFloat); // Protokollieren von Text einschließlich Float-Nummern.
  • NSLog (@ "data:% i", myInteger); // Protokollieren von Text einschließlich Ganzzahl.
  • NSLog (@ "data:% @", myStringOrObject); // Protokollierung von Text, der auf einen anderen String oder ein von NSObject abgeleitetes Objekt verweist.

Bemerkungen

Für die Protokollierung verschiedener Objekttypen und Datentypen siehe: Objective-C, Formatbezeichner

Protokollierung

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

Das erste Argument von NSLog ist ein NSString , der das Protokollnachrichtenformat enthält. Die restlichen Parameter werden als Werte verwendet, um die Formatbezeichner zu ersetzen.

Die Formatierung funktioniert genauso wie printf , mit Ausnahme des zusätzlichen Formatbezeichners %@ für ein beliebiges Objective-C-Objekt. Diese:

NSLog(@"%@", object);

ist äquivalent zu:

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

NSLog vs printf

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

Ausgabe:

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

NSLog gibt zusätzlich zur Protokollnachricht Datum, Uhrzeit, Prozessname, Prozess-ID und Thread-ID aus. printf gibt nur die Nachricht aus.

NSLog erfordert einen NSString und fügt am Ende automatisch eine neue NSString hinzu. printf erfordert eine C-Zeichenfolge und fügt nicht automatisch eine neue Zeile hinzu.

NSLog sendet die Ausgabe an stderr , printf sendet die Ausgabe an stdout .


Einige format-specifiers in printf und NSLog unterscheiden sich. Beim Einfügen einer verschachtelten Zeichenfolge treten beispielsweise folgende Unterschiede auf:

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

NSLog-Ausgabeformat

NSLog(@"NSLog message");

Die Nachricht, die beim Aufruf von NSLog gedruckt wird, hat bei NSLog in Console.app das folgende Format:

Datum Zeit Programmname Prozess ID Thread-ID Botschaft
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

Protokollieren von Variablenwerten

Sie sollten NSLog ohne eine literale NSLog wie NSLog aufrufen:

NSLog(variable);    // Dangerous code!

Wenn die Variable kein NSString , NSString das Programm ab, da NSLog einen NSString erwartet.

Wenn die Variable ein NSString , funktioniert sie, sofern Ihre Zeichenfolge kein % enthält. NSLog analysiert die % -Sequenz als Formatbezeichner und liest dann einen NSLog aus dem Stapel, wodurch ein Absturz verursacht oder sogar beliebiger Code ausgeführt wird .

Machen Sie stattdessen immer das erste Argument zu einem Formatbezeichner wie folgt:

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

Leere Nachricht wird nicht gedruckt

Wenn NSLog aufgefordert wird, leere Zeichenfolge zu drucken, wird das Protokoll vollständig NSLog .

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

Der obige Code druckt nichts .

Es ist empfehlenswert, Logs mit Labels voranzustellen:

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

Der obige Code wird gedruckt:

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

Protokollanweisungen aus Release-Builds entfernen

Nachrichten, die aus NSLog gedruckt NSLog werden in Console.app selbst im Release-Build Ihrer App angezeigt. NSLog ist nicht sinnvoll für Ausdrucke, die nur zum Debuggen nützlich sind. Um dieses NSLog zu beheben, können Sie dieses Makro anstelle von NSLog zur Debug-Protokollierung verwenden.

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

Benutzen:

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

In Debugbuilds DLog rufen NSLog . In Release-Builds wird DLog nichts tun.

__FUNCTION __ verwenden

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

Fügt den Klassen- und Methodennamen in die Ausgabe ein:

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

NSLog und BOOL-Typ

Es gibt keinen Formatbezeichner zum Drucken eines booleschen Typs mit NSLog. Eine Möglichkeit, einen booleschen Wert zu drucken, ist die Umwandlung in einen String.

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

Ausgabe:

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

Eine andere Methode zum Drucken eines booleschen Werts besteht darin, ihn in eine Ganzzahl umzuwandeln und eine binäre Ausgabe zu erhalten (1 = Ja, 0 = Nein).

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

Ausgabe:

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

NSLog-Metadaten protokollieren

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

Protokolliert die Datei-, Zeilennummern- und Funktionsdaten zusammen mit den zu protokollierenden Variablen. Dies kann die Protokollzeilen insbesondere bei ausführlichen Datei- und Methodennamen erheblich verlängern, kann jedoch die Fehlerdiagnose beschleunigen.

Sie können dies auch in ein Makro packen (speichern Sie es in einem Singleton oder wo Sie es am dringendsten brauchen);

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

Wenn Sie sich dann anmelden möchten, rufen Sie einfach an

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

Was gibt Ihnen etwas wie;

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

Protokollierung durch Anhängen an eine Datei

NSLog ist gut, aber Sie können auch protokollieren, indem Sie stattdessen an eine Datei anhängen und dabei Code wie

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow