Comment vider les données stockées dans object-c object (NSArray ou NSDictionary)

Pardonnez-moi une question potentiellement stupide ici, mais dans d’autres langages de programmation (les scripts comme PHP ou Perl), il est souvent facile de sauvegarder tout ce qui est contenu dans une variable.

Par exemple, en PHP, il y a les fonctions var_dump() ou print_r() . Perl a la classe Data::Dumper CPAN, etc. etc.

Y a-t-il quelque chose comme ça pour Objective-C? Dans certains cas, il serait très pratique de pouvoir tout récupérer comme cela, au lieu d’utiliser gdb pour inspecter chaque variable.

Dans Cocoa, il n’y a pas de “dump” comme print_r de PHP ou repr de python puisqu’il n’y a pas de format textuel qui “représente” un object comme dans ces langages. Si tu utilises

 NSLog(@"%@", myObj); 

ou

 NSSsortingng *ssortingngRep = [NSSsortingng ssortingngWithFormat:@"%@",myObj]; 

ou

 NSSsortingng *ssortingngRep = [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 ( pas un vidage) d’un object.

Si vous invoquez po myObj dans gdb, vous obtenez [myObj debugDescription] (souvent identique à la description , mais pas toujours).

Les classes comme NSArray et NSDictionary et NSData remplacent la description pour imprimer une description récursive très utile de leur contenu, mais la valeur par défaut [NSObject description] imprime uniquement la valeur de pointeur correspondant à l’instance.

Si vous contrôlez le code pour les types en question, vous pouvez remplacer leur description ou les méthodes debugDescription pour renvoyer tout ce que vous voulez. Sinon, vous pouvez remplacer la description ou la méthode debugDescription utilisant une catégorie, ou utiliser une catégorie pour définir myDebugDescription ou une myDebugDescription telle que vous pouvez ensuite appeler à partir de gdb en utilisant po [myObj myDebugDescription] .

Vous pouvez également utiliser la commande gdb print object pour afficher rapidement un object dans le débogueur:

 po dictionary 

Ce sera fondamentalement le même que d’appeler NSLog (…) à partir de votre code.

Aussi utile lors de l’impression de NSData contenant des données ASCII:

 p (char *) [data bytes] 

Utilisez NSLog () pour vider le contenu des objects. Par exemple:

 NSData* myData = //... assume this exists NSLog(@"Contents of myData: %@", myData); 

NSLog a une chaîne de format de type printf (attend un object NSSsortingng) suivi d’une liste de parameters variables, tout comme printf. Le caractère de remplacement% @ représente un object de la méthode de description sur un object. Ceci est utile pour vider la plupart des objects Objective-C dans Cocoa.

Si vous voulez vider le contenu d’un object en utilisant gdb (je vous vois balisé avec gdb), utilisez la directive spéciale “po” à la place de print. Par exemple:

 gdb) po myData 

Gdb va alors vider l’object myData. po est un raccourci pour print-object.

Soyez prudent avec la journalisation NSLog – vous ne le souhaiterez 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.

J’utilise habituellement 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 objects de la myarray NSArray, puis myarray et imprimera chaque object.

J’espère que cela peut être utile pour quelqu’un!