Je suis habitué à programmer et à faire en sorte que les messages du journal soient visibles. Je sais que vous pouviez utiliser NSLog()
pour tracer des messages lors du débogage d'applications Cocoa. Quel est le meilleur moyen de "tracer" les messages lors du codage dans un environnement de développement iPhone Xcode?
Il existe un moyen beaucoup plus pratique de suivre les messages de journal dans Xcode, à l'aide des actions de point d'arrêt.
Sur la ligne de code où vous seriez tenté d’ajouter un printf ou un NSLog, définissez un point d'arrêt, puis cliquez dessus tout en maintenant la touche Ctrl enfoncée, puis choisissez "Modifier le point d'arrêt". Dans la bulle bleue qui apparaît, cliquez sur le bouton + à droite pour ouvrir les Actions du point d'arrêt: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png
Entrez votre texte de journal ici. Toute expression pouvant être imprimée dans le débogueur peut être utilisée lorsqu'elle est délimitée par des signes @.
Pour déboguer Objective-C, il est généralement plus utile de choisir "Commande de débogage" dans la fenêtre contextuelle et entrez "po [[méthode d'objet]]" "pour imprimer la chaîne de description d'un objet Objective-C ou le résultat d'un appel de méthode.
Assurez-vous de cocher la case "Continuer" en haut à droite pour que l'exécution se poursuive après le journal.
Avantages de ceci par rapport à NSLog et à printf:
Consultez également le bouton Parler; c'est idéal pour le débogage d'applications en plein écran où vous ne pouvez pas voir le journal de débogage.
Voici un bon morceau de code que j'ai ramassé quelque part sur le Web. Il définit les nouvelles fonctions DLog () et ALog (). Les messages DLog n'apparaissent que lorsque l'application est compilée avec un indicateur -DDEBUG (define DEBUG). ALOG messages TOUJOURS apparaissent (même en mode Libération).
// 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__);
Dans mon projet, j'ai une solution personnalisée basée sur DebugOutput.m Ceci ajoute le numéro de fichier et de ligne à la sortie de débogage, ce qui facilite l'identification de l'origine du texte de sortie tout en le gardant bref.
J'ai augmenté la solution standard avec un masque de débogage afin de pouvoir activer et désactiver le débogage pour des zones particulières de fonctionnalité de mon application. Dans Debug.h, j'ai
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__]
Et dans 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];
}
Dans l'application, les appels ressemblent à quelque chose comme ceci:
debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);
Collez ceci dans l'en-tête de votre préfixe. TOUS les journaux du projet disparaîtront à coup sûr.
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
Vous pouvez utiliser NSLogger qui apporte beaucoup plus à la table que la simple journalisation de vos messages. J'utilise des macros pour désactiver les journaux des versions, tout en les laissant actifs dans les versions de débogage. Le volume de journal n’est pas un problème, car NSLogger offre de puissantes options de filtrage des journaux.