Ich bin es gewohnt, zu programmieren und Protokollnachrichten sichtbar zu machen. Ich weiß, dass Sie in der Lage waren, NSLog()
zum Nachverfolgen von Nachrichten beim Debuggen von Cocoa-Anwendungen einzusetzen. Was ist der beste Weg, um Nachrichten beim Codieren in einer iPhone Xcode-Entwicklungsumgebung zu "verfolgen"?
Es gibt eine weitaus bequemere Möglichkeit, Protokollnachrichten in Xcode zu verfolgen, und zwar mit Haltepunktaktionen.
Setzen Sie in der Codezeile, in der Sie versucht wurden, eine printf oder ein NSLog hinzuzufügen, einen Haltepunkt, klicken Sie dann mit der rechten Maustaste darauf und wählen Sie "Haltepunkt bearbeiten". Klicken Sie in der blauen Blase auf die Schaltfläche +, um die Haltepunktaktionen zu öffnen: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png
Geben Sie dort Ihren Protokolltext ein. Jeder Ausdruck, der im Debugger gedruckt werden kann, kann verwendet werden, wenn er durch @ -Zeichen getrennt wird.
Für das Debuggen von Objective-C ist es im Allgemeinen sinnvoller, "Debugger-Befehl" aus dem Popup auszuwählen und "po [[Objektmethode] Methode]" einzugeben, um den Beschreibungsstring eines Objective-C-Objekts oder das Ergebnis eines Methodenaufrufs zu drucken.
Klicken Sie oben rechts auf das Kontrollkästchen "Weiter", um die Ausführung nach dem Protokoll fortzusetzen.
Vorteile gegenüber NSLog und printf:
Schauen Sie sich auch die Speak-Taste an. Es eignet sich hervorragend zum Debuggen von Vollbild-Apps, bei denen das Debug-Protokoll nicht angezeigt wird.
Hier ist ein großartiger Code, den ich irgendwo im Web gefunden habe. Es definiert die neuen Funktionen DLog () und ALog (). DLog-Nachrichten werden nur angezeigt, wenn die App mit dem Flag -DDEBUG (DEBUG definieren) kompiliert wird. ALog-Meldungen werden IMMER angezeigt (auch im Freigabemodus).
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
In meinem Projekt habe ich eine angepasste Lösung basierend auf DebugOutput.m . Dies fügt die Datei- und Zeilennummer zur Debug-Ausgabe hinzu, wodurch es einfacher wird, den Ursprung dieses Ausgabetextes zu identifizieren, während er dennoch kurz gehalten wird.
Ich habe die Standardlösung um eine Debug-Maske erweitert, sodass ich das Debugging für bestimmte Funktionsbereiche in meiner App ein- und ausschalten kann. In Debug.h habe ich
typedef enum {
kDebugMaskAp- = 1,
kDebugMaskXMLParser = 1 << 1,
kDebugMaskNetwork = 1 << 2,
kDebugMaskAnalytics = 1 << 3,
kDebugMaskCache = 1 << 4,
} debugBitMask;
#define debugForComponent(mask,format,...) if( currentDebugMask() & mask) [[DebugOutput sharedDebug] output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__]
Und in Debug.m
-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ...
{
va_list argList;
NSString *filePath, *formatStr;
// Build the path string
filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding];
// Process arguments, resulting in a format string
va_start(argList, input);
formatStr = [[NSString alloc] initWithFormat:input arguments:argList];
va_end(argList);
// Call NSLog, prepending the filename and line number
NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr);
[filePath release];
[formatStr release];
}
In der Anwendung sehen Aufrufe in etwa so aus:
debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);
Fügen Sie dies in Ihren Präfix-Header ein. ALLE Protokolle aus dem Projekt werden sicher verschwinden.
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
Sie könnten NSLogger verwenden, was weitaus mehr zur Folge hat als nur das Protokollieren Ihrer Nachrichten. Ich verwende Makros, um Protokolle in Release-Builds zu deaktivieren, während jeder einzelne davon in Debug-Builds aktiv bleibt. Das Protokollvolumen ist kein Problem, da NSLogger leistungsstarke Protokollfilteroptionen bietet.