Objective-C Language
Enregistrement
Recherche…
Syntaxe
- NSLog (@ "text to log"); // Journal de texte de base
- NSLog (@ "data:% f -% .2f", myFloat, anotherFloat); // Enregistrement du texte, y compris les nombres flottants.
- NSLog (@ "data:% i", myInteger); // Enregistrement de texte incluant un nombre entier.
- NSLog (@ "data:% @", myStringOrObject); // Enregistrement de texte faisant référence à une autre chaîne ou à un objet dérivé de NSObject.
Remarques
Pour la journalisation de différents types d'objets et de types de données, reportez-vous à: Objective-C, Spécificateurs de format
Enregistrement
NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);
Le premier argument de NSLog
est un NSString
contenant le format du message de journal. Les autres paramètres sont utilisés comme valeurs pour remplacer les spécificateurs de format.
Le formatage fonctionne exactement comme printf
, à l'exception du spécificateur de format supplémentaire %@
pour un objet Objective-C arbitraire. Ce:
NSLog(@"%@", object);
est équivalent à:
NSLog(@"%s", [object description].UTF8String);
NSLog vs printf
NSLog(@"NSLog message");
printf("printf message\n");
Sortie:
2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message
NSLog
la date, l'heure, le nom du processus, l'ID du processus et l'ID du thread en plus du message de journal. printf
que le message.
NSLog
nécessite un NSString
et ajoute automatiquement une nouvelle ligne à la fin. printf
nécessite une chaîne C et n'ajoute pas automatiquement une nouvelle ligne.
NSLog
envoie la sortie à stderr
, printf
envoie la sortie à stdout
.
Certains format-specifiers
dans printf
vs NSLog
sont différents. Par exemple, lorsque vous incluez une chaîne imbriquée, les différences suivantes sont à prévoir:
NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);
Format de sortie NSLog
NSLog(@"NSLog message");
Le message qui est imprimé en appelant NSLog
a le format suivant lorsqu'il est affiché dans Console.app:
Rendez-vous amoureux | Temps | Nom du programme | ID du processus | ID de fil | Message | |
---|---|---|---|---|---|---|
2016-07-16 | 08:58:04.681 | test | [46259 | : | 1244773] | NSLog message |
Enregistrement des valeurs variables
Vous ne devriez pas appeler NSLog
sans une chaîne de format littérale comme celle-ci:
NSLog(variable); // Dangerous code!
Si la variable n'est pas une NSString
, le programme se NSLog
, car NSLog
attend une NSString
.
Si la variable est une NSString
, elle fonctionnera à moins que votre chaîne ne contienne un %
. NSLog
analysera la séquence %
tant que spécificateur de format, puis lira une valeur de mémoire de la pile, provoquant un blocage ou même exécutant du code arbitraire .
Au lieu de cela, faites toujours le premier argument comme spécificateur de format, comme ceci:
NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);
Le message vide n'est pas imprimé
Lorsque NSLog
est invité à imprimer une chaîne vide, il omet complètement le journal.
NSString *name = @"";
NSLog(@"%@", name); // Resolves to @""
Le code ci-dessus n'imprimera rien .
Il est recommandé de préfixer les journaux avec des étiquettes:
NSString *name = @"";
NSLog(@"Name: %@", name); // Resolves to @"Name: "
Le code ci-dessus sera imprimé:
2016-07-21 14:20:28.623 App[87711:6153103] Name:
Suppression des enregistrements de journal des versions de publication
Les messages imprimés à partir de NSLog
sont affichés sur Console.app même dans la version de publication de votre application, ce qui n'a aucun sens pour les impressions qui ne sont utiles que pour le débogage. Pour résoudre ce problème, vous pouvez utiliser cette macro pour la journalisation du débogage au lieu de NSLog
.
#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif
Utiliser:
NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!");
Dans les versions de débogage, DLog
appellera NSLog
. En version release, DLog
ne fera rien.
Utiliser __FUNCTION __
NSLog(@"%s %@",__FUNCTION__, @"etc etc");
Insère le nom de la classe et de la méthode dans la sortie:
2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc
Type NSLog et BOOL
Il n'y a pas de spécificateur de format pour imprimer le type booléen en utilisant NSLog. Une façon d’imprimer une valeur booléenne consiste à la convertir en chaîne.
BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");
Sortie:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES
Une autre façon d’imprimer une valeur booléenne consiste à la convertir en entier, en obtenant une sortie binaire (1 = oui, 0 = non).
BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);
Sortie:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1
Consignation des métadonnées NSLog
NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);
Enregistre le fichier, le numéro de ligne et les données de fonction avec les variables que vous souhaitez consigner. Cela peut rendre les lignes de journal beaucoup plus longues, en particulier avec les noms de fichier et de méthode détaillés, mais cela peut aider à accélérer les diagnostics d'erreur.
Vous pouvez également emballer ceci dans une macro (stockez ceci dans un Singleton ou où vous en aurez le plus besoin);
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
Ensuite, lorsque vous souhaitez vous connecter, appelez simplement
ALog(@"name: %@", firstName);
Ce qui vous donnera quelque chose comme;
-[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John
Enregistrement en ajoutant à un fichier
NSLog est bon, mais vous pouvez également vous connecter en ajoutant un fichier à la place, en utilisant le code suivant:
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];
}