In diesem kurzen Tipp erfahren Sie, wie Sie die von NSLog generierte Ausgabe anpassen können, um Programme effizienter zu debuggen. Weiter lesen!
Standardmäßig zeigt NSLog die Ausgabe im folgenden Format an:
Datum Uhrzeit OurApp [] NSLog-Ausgabe
Ein reales Beispiel könnte so aussehen:
2013-08-03 00: 35: 53.038 TestApp [460: c07] Ergebniswert = 20
Die Standardausgabe ist gut, lässt jedoch zu wünschen übrig. In den meisten Fällen möchten wir Folgendes in einer Protokollanweisung sehen:
Kurz gesagt, wir möchten, dass NSLog eher so aussieht:
(ClassName MethodName) (SourceFileName: LineNumber) NSLog-Ausgabe
Sehen wir uns zunächst an, wie NSLog unverändert funktioniert. NSLog ist nur eine C-Funktion, die in das Grundgerüst von Cocoa integriert ist, und verhält sich wie jede andere variadische C-Funktion. Insbesondere sendet NSLog Fehlermeldungen an die Apple-Systemprotokollfunktion. Dies geschieht einfach durch Übergabe der Argumente an die NSLogv-Funktion.
Da NSLog nur ein Wrapper für NSLogv ist, können wir NSLog mit unserem eigenen benutzerdefinierten Aufruf von NSLogv neu definieren. Genau das zeige ich Ihnen in diesem Tutorial.
Erstellen Sie ein neues iOS-Projekt in Xcode mit der Leere Anwendung Vorlage. Nennen ExtendNSLog. Aktivieren Sie die Option für Automatic Reference Counting, deaktivieren Sie jedoch die Optionen für Core Data und Unit Tests.
Erstellen Sie ein iOS-Projekt mit der Vorlage "Leere Anwendung" Produktname sollte "ExtendNSLog" seinErstellen Sie jetzt eine Header-Datei zusammen mit dem Projekt. Wählen Neue Datei> Ziel - Klasse C. Legen Sie den Namen der Klasse auf ExtendNSLogFunctionality fest. Dies wird eine Unterklasse von NSObject sein.
Erstellen Sie eine Objective-C-Klassenvorlage Legen Sie den Klassennamen auf ExtendNSLogFunctionality festÖffnen ExtendNSLogFunctionality.h und fügen Sie den folgenden Code in die Kopfzeile ein:
#einführen#ifdef DEBUG #define NSLog (args…) ExtendNSLog (__ DATEI __, __ LINE __, __ PRETTY_FUNCTION __, args); #else #define NSLog (x…) #endif void ExtendNSLog (const char * Datei, int lineNumber, const char * Funktionsname, NSString * -Format, ...);
Die obige Bedingung definiert ein NSLog
Anweisung nur, wenn DEBUG definiert ist. Wenn DEBUG nicht definiert ist, führt die NSLog-Anweisung nichts aus. Es stellt sich die Frage: Wie steuern Sie, wann DEBUG definiert ist? Dies kann durch Zuweisen von DEBUG = 1 in den Präprozessoreinstellungen für Ihr Projekt erfolgen.
Klicken Sie dazu auf Ihr Anwendungsziel und wählen Sie die Registerkarte Build-Einstellungen. Stellen Sie anschließend sicher, dass die Optionen "Alle" und "Kombiniert" ausgewählt sind. Suchen Sie nach "Preprocessing" und suchen Sie den Abschnitt "Preprocessor Macros". Als nächstes fügen Sie einfach "DEBUG = 1" zum Debug-Abschnitt hinzu.
Fügen Sie den Präprozessor-Einstellungen das Flag DEBUG = 1 hinzuBeachten Sie, dass in neueren Xcode-Projektvorlagen bereits ein DEBUG = 1-Makro für die Debug-Build-Konfiguration im Abschnitt "Präprozessor-Makros" definiert ist. Weitere Informationen finden Sie in diesem Beitrag zu StackOverflow.
Wenn das Debug-Makro definiert ist, müssen Sie als Nächstes die benutzerdefinierte Version von NSLog schreiben. Öffnen Sie ExtendNSLogFunctionality.m und geben Sie den folgenden Code ein:
#import "ExtendNSLogFunctionality.h" void ExtendNSLog (const char * -Datei, int lineNumber, const char * Funktionsname, NSString * -Format, ...) // Typ, der Informationen zu Variablenargumenten enthält. va_list ap; // Eine Variablenargumentliste initialisieren. va_start (ap, format); // NSLog fügt am Ende des NSLog-Formats nur eine neue Zeile hinzu, wenn // noch keine vorhanden ist. // Hier verwenden wir diese Funktion von NSLog () if (! [Format hasSuffix: @ "\ n"]) format = [format stringByAppendingString: @ "\ n"]; NSString * body = [[NSString-Zuordnung] initWithFormat: Formatargumente: ap]; // Ende mit der Liste der Variablenargumente. va_end (ap); NSString * fileName = [[NSString stringWithUTF8String: file] lastPathComponent]; fprintf (stderr, "(% s) (% s:% d)% s"), Funktionsname, [Dateiname UTF8String], Zeilennummer, [Körper UTF8String]);
Fügen Sie nun das ExtendNSLogFunctionality.h-Include zur Präfix-Header-Datei Prefix.pch im Abschnitt #ifdef __OBJC__ hinzu.
#ifdef __OBJC__ #import#einführen #import "ExtendNSLogFunctionality.h" #endif
Für ein besseres Verständnis der Präfix-Header lesen Sie bitte diesen Eintrag auf Wikipedia. Informationen zu den bewährten Methoden für Präfix-Header finden Sie in diesem StackOverflow-Beitrag.
Fügen Sie jetzt ein NSLog an einer beliebigen Stelle in Ihrem Projektcode hinzu. In meinem Fall entscheide ich mich, eine AppDelegate.m-Methode hinzuzufügen -Anwendung (BOOL): Anwendung (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
.
int Ergebnis = 20; NSLog (@ "Ergebniswert:% d", Ergebnis);
Wenn Sie das Projekt jetzt mit der Debug-Konfiguration erstellen und ausführen, sollten Sie etwa Folgendes sehen:
(- [AppDelegate-Anwendung: didFinishLaunchingWithOptions:]) (AppDelegate.m: 21) Ergebniswert: 20
Prost! Diese Ausgabe ist viel nützlicher als die Standardimplementierung. Hoffentlich finden Sie, dass diese Technik Ihnen beim Debuggen Ihrer eigenen Programme viel Zeit spart!