Pardonnez-moi une question potentiellement idiote ici, mais dans d'autres langages de programmation (ceux de script comme PHP ou Perl), il est souvent facile de vider tout ce qui est contenu dans une variable.
Par exemple, dans PHP il y a les fonctions var_dump()
ou print_r()
. Perl a les Data::Dumper
Classe CPAN, etc.
Y a-t-il quelque chose comme ça pour Objective-C? Il serait très pratique dans quelques cas de pouvoir tout vider comme ça, au lieu d'utiliser gdb pour inspecter chaque variable.
Dans Cocoa, il n'y a pas de "vidage" comme print_r de PHP ou repr de PHP car il n'y a pas de format textuel qui "représente" un objet comme dans ces langages. Si tu utilises
NSLog(@"%@", myObj);
ou
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
ou
NSString *stringRep = [myObj description];
vous obtiendrez (connecté à la console dans le premier cas), le résultat de [myObj description]
, une méthode définie dans NSObject
dans le but d'imprimer une description (not un vidage) d'un objet.
Si vous invoquez po myObj
dans gdb, vous obtenez [myObj debugDescription]
(souvent identique à description
, mais pas toujours).
Des classes comme NSArray
et NSDictionary
et NSData
remplacent description
pour imprimer une description récursive assez utile de leur contenu, mais la valeur par défaut [NSObject description]
imprime uniquement la valeur du pointeur correspondant à l'instance.
Si vous contrôlez le code des types en question, vous pouvez remplacer leurs méthodes description
ou debugDescription
pour renvoyer tout ce que vous voulez. Sinon, vous pouvez remplacer la méthode description
ou debugDescription
à l'aide d'une catégorie, ou utiliser une catégorie pour définir un myDebugDescription
ou une autre telle que vous pourriez ensuite invoquer à partir de gdb en utilisant po [myObj myDebugDescription]
.
vous pouvez également utiliser la commande gdb print object pour afficher rapidement un objet dans le débogueur:
po dictionary
Ce sera essentiellement la même chose que d'appeler NSLog (...) à partir de votre code.
Également utile lors de l'impression de NSData contenant ASCII sont:
p (char *) [data bytes]
Utilisez NSLog () pour vider le contenu des objets. Par exemple:
NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
NSLog a une chaîne de format de style printf (attend un objet NSString) suivie d'une liste variable de paramètres, tout comme printf. Le caractère de remplacement% @ représente un objet la méthode de description sur un objet. Ceci est utile pour vider la plupart des objets Objective-C dans Cocoa.
Si vous voulez vider le contenu d'un objet en utilisant gdb (je vois que vous l'avez tagué avec gdb), utilisez la directive spéciale "po" au lieu de print. Par exemple:
gdb) po myData
provoquera le vidage de l'objet myData par gdb. po est un raccourci pour print-object.
Soyez prudent avec la journalisation NSLog -> vous ne le souhaitez probablement pas dans le code de production.
Vous souhaiterez peut-être utiliser une autre fonction de journalisation qui appelle NSLog lorsque votre produit s'exécute en mode débogage.
Je vais habituellement avec ceci pour "déboguer" le contenu de NSArray:
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
Le code énumérera tous les objets dans NSArray myarray
, puis itérera et imprimera chaque objet.
J'espère que cela peut être utile pour quelqu'un!