Débogueur Xcode: afficher la valeur de la variable

107

Mon code dans un UITableViewController:

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

Comment puis-je voir les valeurs de delegate.myDataou indexPath.rowdans le débogueur? delegate.myDatadevrait être un tableau et indexPath.rowun int. Je ne peux voir que les adresses mémoire des objets delegateet indexPathmais où sont myDataet row?

texte alternatif

Manni
la source

Réponses:

142

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

J'utilise aussi

po variableName
print variableName

dans la console.

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

print [myData objectAtIndex:indexPath.row]  

ou

po [myData objectAtIndex:indexPath.row]
Andriy
la source
Je vous remercie! J'essaye beaucoup: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Mais à chaque fois je a obtenu le message "Il n'y a aucun membre nommé ligne." Cela fonctionne: "print indexPath" et "po indexPath". J'ai donc essayé d'utiliser "[]" à la place de ".": "Po [indexPath row]" -> "Impossible d'imprimer la description d'un objet NIL." "po [indexPath getRow]" -> "La cible ne répond pas à ce sélecteur de message." :-(
Manni
4
try print (int) [indexPath row]
Andriy
po [myData objectAtIndex: (int) [indexPath row]]
Andriy
@VanDuTran Je suis presque sûr que l'équivalent de po objSwift est po print(obj).
Chris
C'était également parfait pour trouver les valeurs des propriétés calculées. Merci!
Paula Hasstenteufel
25

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

Après avoir cherché et ne pas trouver de réponse / tutoriel simple sur la façon de déboguer des variables dans Xcode, je suis allé explorer avec 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.

Bouton de zone de débogage

Zone de débogage dans Xcode 4.6.3

Maintenant, définissez un point d'arrêt - la ligne de votre code où vous souhaitez que votre programme se mette en pause, en cliquant sur la bordure de votre zone de code.

Point d'arrêt

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

Zone de débogage fractionnée

Devrait ressembler à ça

Maintenant, lancez votre application.

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

Champ de recherche

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

Entrer dans

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

Menu contextuel

Comme vous pouvez le voir, ce menu contextuel regorge d'options de débogage très intéressantes. Comme Watch qui a déjà été suggéré avec des commandes tapées ou encore Edit Value… qui change la valeur d'exécution de votre variable!

Lex L.
la source
21

Vous pouvez également:

  1. Définissez un point d'arrêt pour suspendre l'exécution.
  2. L'objet doit être dans la portée d'exécution
  3. Déplacez le pointeur de la souris sur l'objet ou la variable
  4. Une info-bulle jaune apparaîtra
  5. Déplacez la souris sur l'info-bulle
  6. Cliquez sur les deux petites flèches pointant vers le haut et vers le bas
  7. Un menu contextuel apparaîtra
  8. Sélectionnez "Imprimer la description", il exécutera une [description de l'objet]
  9. La description apparaîtra dans la sortie de la console

IMHO un peu caché et encombrant ...

Homme léger
la source
Dans mon xcode "Description de l'impression" ne fonctionne pas, alors comment puis-je l'activer?
Kirtikumar A.
@kirtiavaiya, l'application doit être en pause et votre variable doit être dans la portée actuelle pour être imprimée. Vous ne pouvez pas non plus imprimer directement "self.variable", mais vous pouvez utiliser la solution 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)
LightMan
@LightMan oui, c'est comme vous l'avez dit, mais aussi
ça
10

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) des variables (d'instance).

L'expression

indexPath.row

est équivalent à

[indexPath row]

et la mission

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.

De plus, delegateest 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 de type réelles pour delegateà ce moment-là, et le débogueur se fie aux informations fournies au moment de la compilation. Puisqu'il ids'agit d'un type générique, il n'y a aucune information à la compilation sur les variables d'instance dans delegate.

Ce sont les raisons pour lesquelles vous ne voyez pas myDataou rowcomme des variables.

Si vous souhaitez inspecter le résultat de l'envoi -rowou -myData, vous pouvez utiliser des commandes pou po:

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

ou utilisez la fenêtre des expressions (par exemple, si vous savez que votre delegateest de type réel MyClass *, vous pouvez ajouter une expression (MyClass *)delegate, ou cliquer avec le bouton droit de la souris delegate, choisir View Value as…et taper le type réel de delegate(par exemple MyClass *).

Cela étant dit, je conviens que le débogueur pourrait être plus utile:

  • Il peut y avoir une option pour 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, d'accord, mais fournirait des informations utiles;

  • Les propriétés déclarées peuvent ê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 / d'exécuter une méthode afin d'obtenir des informations, mais fournirait également des informations utiles.

Chris G.
la source
Merci pour ton explication! Cela m'a beaucoup aidé! :-)
Manni
7

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

  1. Placez un point d'arrêt pour lequel vous souhaitez obtenir des valeurs
  2. Effectuez maintenant un débogage étape par étape.
  3. Placez un curseur sur la variable / le délégué dont la valeur doit être vérifiée au moment de l'exécution.
  4. Maintenant, cela affichera la description de la variable / délégué
  5. Cliquez sur "i" pour afficher une description détaillée
  6. Cela imprimera également les détails sur la fenêtre de la console.

Capture d'écran pour imprimer les détails sur la fenêtre de la console

Jayprakash Dubey
la source
1
Est-ce que cela fonctionne sur swift, je suis nouveau pour swift ne peut pas voir les valeurs d'objet comme nous utilisons pour voir dans obj c.
umairhhhs
1
@umairhhhs Ce message est pour Objective-C uniquement.
Jayprakash Dubey
1
Je me demande pourquoi ce n'est pas dans l'éditeur rapide parce que c'était une fonctionnalité très utile et rapide.
umairhhhs
1

Cela devient un peu compliqué. Ces objets sont des classes ou des structures personnalisées, et les regarder à l'intérieur n'est pas aussi facile sur Xcode que dans d'autres environnements de développement.

Si j'étais vous, je NSLoggerais les valeurs que vous voulez voir, avec une description.

c'est à dire:

NSLog(@"Description of object & time: %i", indexPath.row);
Aurum Aquila
la source
11
Oui, NSLog est une possibilité mais pas une alternative confortable au débogage. Je suis très surpris qu'il n'y ait aucun moyen d'afficher les valeurs souhaitées. Cela appartient à la fonctionnalité de base d'un environnement de développement.
Manni
2
La chose la plus exaspérante à propos de XCode. Pathétique.
ryan0
1

Essayez Exécuter-> Afficher-> Expressions

Entrez le nom du tableau ou ce que vous recherchez.

tbone
la source
Je vous remercie! J'ai entré "indexPath.row" et "Delegate.myData" dans la fenêtre d'expression mais à chaque fois apparaît "hors de portée" dans la colonne "Résumé" :-(
Manni
np, j'ai eu le même problème jusqu'à ce que je le trouve;)
tbone
1
définissez un point d'arrêt juste après avoir défini votre tableau ou autre et vous devriez trouver la valeur dans Expressions. Bonne chance
tbone