2010-09-13 6 views
2

La ligne ci-dessous a une erreur, pouvez-vous le voir à l'œil nu?Correctement débogage applications iPhone sur XCode

NSString *title = [sender titleForState:UIControlStateNormal]; 
NSString *newText = [[NSString alloc] initWithFormat:"%@ button pressed.", title]; 

Lorsque le simulateur iPhone exécute cette ligne il se bloque sans autre information. Je dois manquer quelque chose au sujet du débogage. La console ne m'a rien montré.

J'ai été en mesure de comprendre l'erreur, ma question n'est pas à ce sujet. Ma question est pourquoi je reçois un crash sans aide de XCode. Sans aucune idée, il m'a fallu 5 minutes précieuses avant que je puisse réaliser ma faute de frappe.

Des suggestions? Ou lors de la programmation pour iPhone, je dois juste faire très attention avec les fautes de frappe?

EDIT: Je suppose que certaines personnes ne l'ont pas vu immédiatement comme moi. L'erreur est l'absence de '@' pour la constante de chaîne. Alors maintenant, ma question est pourquoi XCode/Simulator ne m'a pas montré un message d'erreur, juste écrasé sans aucun indice. Ai-je raté quelque chose à propos du débogage?

+0

Quelle est la valeur de 'title' avant l'exécution de la ligne? –

+0

nous éclairer à l'erreur s'il vous plaît - Je suis sûr que ne va pas démarrer xcode, coller le code, ...... pour le savoir. – KevinDTimm

+0

J'ai ajouté la valeur du titre au code. – TraderJoeChicago

Répondre

5

Objective-C ne vérifie pas fermement que les arguments que vous passez à des messages sont du type droit lors de la compilation, ni à runtime. Il devrait vous donner un avertissement cependant. Ici, vous passez une chaîne c au lieu d'un NSString. Parce que NSString sont des objets (donc référencés à l'aide du pointeur), votre méthode l'utilise comme un pointeur pendant que vous l'alimentez avec une chaîne simple. Vous essayez alors probablement d'accéder aux blocs de mémoire inaccessibles ...

+0

Merci. Je suppose que je ne manque rien et c'est comme ça que ça devrait marcher. Crash dur. Pas même la ligne où il se bloque durement est donnée. Je devais utiliser des points d'arrêt. Cette question est juste de réaliser si je dois m'habituer à ce processus de débogage douloureux ou s'il y a de meilleurs moyens de déboguer cela sur XCode. – TraderJoeChicago

+4

Je suis curieux de savoir pourquoi vous n'avez reçu aucun avertissement. J'ai tapé votre code dans Xcode sur ma machine juste pour être sûr et cela m'a donné un "avertissement: passage de l'argument 1 de 'initWithFormat:' du type de pointeur incompatible" warning. – VdesmedT

+0

D'accord. J'ai eu une erreur, que j'ai posté ci-dessous. –

3

Je pense que vous manquez un @ avant que le bouton "% @ ne soit enfoncé". Le bon devrait être:

NSString *newText = [[NSString alloc] initWithFormat:@"%@ button pressed.", title];

Toutes les NSString constante devrait être @"SOMETHING HERE";

+0

Ok. Bon oeil. Mais la question est pourquoi je ne reçois aucune aide de XCode/Simulator pour repérer ce bug. C'est juste un dur crash. Est-ce qu'il me manque quelque chose sur le débogage sur XCode/Simulator? – TraderJoeChicago

+5

downvotes sont inappropriés, puisque l'OP ne nous dirait pas l'erreur, c'est une bonne information. – KevinDTimm

+0

pourquoi c'est downvoted? "peux-tu le voir à l'oeil nu" se termine par un point d'interrogation et l'an est fait avant l'EDIT dans la question. – taskinoor

3

Vérifiez vos avertissements de compilation. C'est tout ce dont tu as besoin. Sur le cas que vous montrez, vous recevrez un avertissement approprié qui vous alertera que de mauvaises choses pourraient arriver à cette ligne.

1

je reçois l'erreur suivante lors de la compilation de votre code:

error: cannot convert 'const char*' to 'NSString*' in argument passing 

Je ne sais pas ce que vous devez faire pour l'obtenir pour vous montrer que, je travaille en Obj-C++. Essayez d'ajouter "-Wall" à votre "OtherWarningFlags" sous les paramètres de construction de votre cible.

+0

Je reçois l'avertissement, mais pas l'erreur. Lorsque l'application se bloque, elle ne me dit pas la ligne où elle s'est écrasée. Donc je suppose que c'est prévu. Je dois juste chercher des avertissements et être très prudent avec les accidents de mémoire. Venant de Java, ce n'est pas naturel, mais je peux vivre avec ça. – TraderJoeChicago

+1

"pas naturel" serait un abus de langage. un niveau différent d'interaction avec la machine par votre langage de programmation rendra les erreurs et les avertissements du compilateur beaucoup plus «importants». le fait que vous ayez ignoré un avertissement sur les pointeurs est votre première et meilleure expérience d'apprentissage tout en se développant à ce niveau. tenir compte de ces messages dans le futur. le débogueur n'est pas en faute ici, le débogueur est :) – KevinDTimm

+0

Je suis d'accord Kevin. Leçon apprise. Merci! – TraderJoeChicago