53 votes

Comment changer la valeur de NSString pendant le débogage dans Xcode ?

Lorsque je suis arrêté à un point de rupture dans Xcode, je peux voir la valeur des variables NSString. Comment puis-je les modifier ? Je peux modifier les variables int ou double, mais pas NSString.

0 votes

En 1987, nous pourrions facilement utiliser l'équivalent de l'option "Edit Value..." de Xcode dans toutes les pages du site. réel débogueurs. Maintenant nous sommes relégués à l'écriture du code du débogueur... Retour vers le futur...

87voto

MikeG Points 2292

Vous pouvez le faire dans la console de débogage. Disons que vous avez NSString* myVar . Dans la console, après (gdb) , type set myVar = @"My new string" . Si vous utilisez (lldb) alors utilisez l'expression équivalente expr myVar = @"My new string" à la place.

Cela peut ne pas apparaître correctement dans le panneau des variables, mais vous pouvez vérifier la valeur en saisissant po myVar dans la console. Votre code devrait capter la nouvelle valeur.

Pour de bonnes informations sur l'utilisation expr , consultez ce post de StackOverflow.

0 votes

Cela ne fonctionne pas pour moi dans XCode 4.3.1 en utilisant (lldb). J'obtiens des erreurs du type "reference to 'id' is ambiguous" et "1 errors parsing expression".

2 votes

Vous rencontrez une variation d'un bogue connu dans XCode 4.3.x. Voir ce poste . D'après la réponse, ce problème est résolu dans XCode 4.4

0 votes

L'utilisation de l'expr whateverVariable = @ "55fc633a22570e2b7e00003b" a fonctionné pour moi.

8voto

n8tr Points 686

Vous pouvez le faire mais vous devez appeler le code depuis l'invite de commande du débogueur. Par exemple, disons que vous avez un point d'arrêt qui se déclenche juste après cette ligne :

NSString *myString = @"My current string";

Puis à l'invite (gdb) tapez :

call myString = @"My new string"

Vous pouvez po myString avant de modifier la chaîne et après l'avoir modifiée pour vérifier qu'elle a bien changé.

Un autre exemple : Disons que vous voulez changer le titre d'un contrôleur de vue. Vous pouvez utiliser le setter. *Note : la notation par points n'est pas prise en charge par la ligne de commande du débogueur. Par exemple, laissez la vue se charger, puis définissez un point d'arrêt quelque part pendant la durée de vie de votre contrôleur de vue. Puis faites ceci :

call (id)[self setTitle:@"New Title"]

Continuez à exécuter le programme et vous devriez voir le titre de votre contrôleur de vue se mettre à jour.

5 votes

Ma réponse est ancienne. Vous pouvez en fait le faire maintenant : po maChaîne = @"ma_nouvelle_chaîne" y po self.title = @ "New Title" (nouveau titre)

2voto

Ramis Points 610

Pour NSError, j'utilise ceci :

(lldb) expression aTempError = (NSError*)[[NSError alloc] initWithDomain:@"MANO" code:1 userInfo:nil]

1voto

Alex Zavatone Points 901

( https://stackoverflow.com/users/1202867/n8tr ) Le commentaire de n8tr ci-dessus montre comment faire. Il suffit de faire précéder votre affectation de "po" comme suit : po maChaîne = @ "ma_nouvelle_chaîne" et po self.title = @ "Nouveau titre".

-1voto

vicvicvic Points 1684

NSString est une classe immuable (c'est-à-dire que les chaînes sont des constantes), vous ne devriez donc pas pouvoir la modifier ("elle" étant la valeur de la chaîne). Vous aurez peut-être plus de chance avec NSMutableString .

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