116 votes

Xcode Debugger : visualiser la valeur d'une variable

Mon code dans un UITableViewController :

delegate.myData = [myData objectAtIndex:indexPath.row];

Comment puis-je voir les valeurs de delegate.myData o indexPath.row dans le débogueur ? delegate.myData doit être un tableau et indexPath.row un int . Je ne peux voir que les adresses mémoire des objets delegate y indexPath mais où sont myData y row ?

alt text

149voto

Andriy Points 803

Vérifiez ceci Comment visualiser le contenu de la variable NSDictionary dans le débogueur Xcode ?

J'utilise également

po variableName
print variableName

dans Console.

Dans votre cas, il est possible d'exécuter

print [myData objectAtIndex:indexPath.row]  

ou

po [myData objectAtIndex:indexPath.row]

0 votes

Merci. J'ai essayé plusieurs fois : "print [myData objectAtIndex:indexPath.row]", "po [myData objectAtIndex:indexPath.row]", "print indexPath.row", "po indexPath.row", ... Mais à chaque fois j'ai eu le message "There is no member named row". Ceci fonctionne : "print indexPath" et "po indexPath". J'ai donc essayé d'utiliser "[]" au lieu de "." : "po [indexPath row]" -> "Can't print the description of a NIL object". "po [indexPath getRow]" -> "La cible ne répond pas à ce sélecteur de message". :-(

4 votes

Try print (int) [indexPath row]

0 votes

Po [myData objectAtIndex :(int) [indexPath row]]

34voto

Lex L. Points 73

Je suis d'accord avec d'autres posters que Xcode en tant qu'environnement de développement devrait inclure un moyen facile de déboguer les variables. Eh bien, bonne nouvelle, il y en a un !

Après avoir cherché et n'avoir pas trouvé de réponse simple ou de tutoriel sur la façon de déboguer les variables dans Xcode, j'ai exploré Xcode lui-même et j'ai trouvé cette découverte (du moins pour moi) très utile.

Comment déboguer facilement vos variables dans Xcode 4.6.3

Dans l'écran principal de Xcode, assurez-vous de voir la zone de débogage inférieure en cliquant sur le bouton du coin supérieur droit montré dans la capture d'écran.

Debug Area button

Debug Area in Xcode 4.6.3

Définissez maintenant un point d'arrêt - la ligne de votre code où vous voulez que votre programme s'arrête, en cliquant sur le bord de votre zone de code.

Breakpoint

Maintenant, dans la zone de débogage, cherchez ces boutons et cliquez sur celui du milieu. Vous remarquerez que votre zone est maintenant divisée en deux.

Split Debug Area

Should look like this

Exécutez maintenant votre application.

Lorsque le premier point d'arrêt est atteint pendant l'exécution de votre programme, vous verrez sur le côté gauche toutes vos variables disponibles à ce point d'arrêt.

Search Field

Vous pouvez développer les flèches de gauche sur la variable pour obtenir plus de détails. Vous pouvez même utiliser le champ de recherche pour isoler la variable que vous souhaitez et la voir changer en temps réel lorsque vous entrez dans la portée du point d'arrêt.

Step Into

Sur le côté droit de votre zone de débogage, vous pouvez envoyer les variables à imprimer comme vous le souhaitez en cliquant avec le bouton droit de la souris sur la variable souhaitée.

Contextual Menu

Comme vous pouvez le constater, ce menu contextuel est rempli d'options de débogage très intéressantes. Par exemple Regarder qui a déjà été suggéré avec des commandes tapées ou même Modifier la valeur qui modifie la valeur d'exécution de votre variable !

21voto

LightMan Points 575

Vous pouvez aussi :

  1. Définissez un point d'arrêt pour interrompre l'exécution.
  2. L'objet doit se trouver dans le périmètre d'exécution
  3. Déplacer le pointeur de la souris sur l'objet ou la variable
  4. Une info-bulle jaune apparaît
  5. Déplacez la souris sur l'infobulle
  6. Cliquez sur les deux petites flèches qui pointent vers le haut et vers le bas.
  7. Un menu contextuel s'affiche
  8. Sélectionnez "Imprimer la description", ce qui permettra d'exécuter une [description de l'objet].
  9. La description apparaîtra dans la sortie de la console

IMHO un peu caché et encombrant...

0 votes

Dans mon xcode "Imprimer la description" ne fonctionne pas, alors comment puis-je l'activer ?

0 votes

@kirtiavaiya l'application doit être en pause, et votre variable doit être à l'intérieur de la portée actuelle pour être imprimée. Vous ne pouvez pas non plus imprimer "self.variable" directement, mais vous pouvez utiliser la solution d'Andriy pour imprimer _<nom de la variable>. Par exemple, pour self.btnHello, écrivez dans la console "po _btnHello" (cela ne fonctionne que si vous n'avez pas changé le nom de la méthode getter).

0 votes

@LightMan oui, c'est comme vous l'avez dit, mais cela ne fonctionne pas non plus.

11voto

Bavarious Points 43993

Votre confusion vient du fait que Les propriétés déclarées ne sont pas (nécessairement nommées de la même manière que) les variables (d'instance).

L'expression

indexPath.row

est équivalent à

[indexPath row]

et l'affectation

delegate.myData = [myData objectAtIndex:indexPath.row];

est équivalent à

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

en supposant une dénomination standard pour les propriétés synthétisées.

En outre, delegate est probablement déclaré comme étant de type id<SomeProtocol> c'est-à-dire que le compilateur n'a pas été en mesure de fournir des informations sur le type réel de la fonction delegate à ce moment-là, et le débogueur s'appuie sur les informations fournies au moment de la compilation. Puisque id est un type générique, il n'y a pas d'information en temps de compilation sur les variables d'instance de delegate .

Ce sont les raisons pour lesquelles tu ne vois pas myData o row comme variables.

Si vous voulez inspecter le résultat de l'envoi -row o -myData vous pouvez utiliser les commandes p o po :

p (NSInteger)[indexPath row]
po [delegate myData]

ou utiliser la fenêtre des expressions (par exemple, si vous connaissez votre delegate est de type réel MyClass * vous pouvez ajouter une expression (MyClass *)delegate ou cliquez avec le bouton droit de la souris delegate choisissez View Value as… et tapez le type réel de delegate (par exemple MyClass * ).

Cela dit, je suis d'accord pour dire que le débogueur pourrait être plus utile :

  • Il pourrait y avoir une option permettant d'indiquer à la fenêtre du débogueur d'utiliser les informations de type d'exécution au lieu des informations de compilation. Cela ralentirait le débogueur, certes, mais fournirait des informations utiles ;

  • Les propriétés déclarées pourraient être affichées dans un groupe appelé propriétés et permettre une inspection (facultative) directement dans la fenêtre du débogueur. Cela ralentirait également le débogueur en raison de la nécessité d'envoyer un message/exécuter une méthode afin d'obtenir des informations, mais fournirait également des informations utiles.

0 votes

Merci pour votre explication ! Cela m'a beaucoup aidé ! :-)

7voto

Jayprakash Dubey Points 1194

Vous pouvez imprimer les valeurs dans la fenêtre de la console au moment de l'exécution. Voici les étapes à suivre :

  1. Placez un point de rupture pour lequel vous voulez obtenir des valeurs
  2. Maintenant, effectuez un débogage étape par étape.
  3. Placez un curseur sur la variable/délégué dont la valeur doit être vérifiée lors de l'exécution.
  4. Maintenant, cela va montrer la description de la variable/délégué.
  5. En cliquant sur "i", vous obtiendrez une description détaillée.
  6. Cela imprimera également les détails dans la fenêtre de la console.

Screenshot for printing details on console window

1 votes

Est-ce que cela fonctionne avec Swift, je suis nouveau dans Swift et je ne peux pas voir les valeurs de l'objet comme on le fait avec obj c.

1 votes

@umairhhhs Ce poste est réservé à l'Objective-C.

1 votes

Je me demande pourquoi cela n'est pas dans l'éditeur swift, car c'était une fonction très utile qui permettait de gagner du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X