Objective-C Language
Protokollierung
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];
}