web-dev-qa-db-fra.com

Comment vider les données stockées dans un objet objective-c (NSArray ou NSDictionary)

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.

45
jpm

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].

71
Barry Wark

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]
16
Ben Gottlieb

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.

10
Jason Coco

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.

4
diciu

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!

3
TCB13