2009-01-25 7 views
0

J'ai un programme de travail qui a été écrit par un autre programmeur que j'essaye d'ajouter quelques fonctionnalités à un effort pour apprendre le SDK de l'iPhone. J'ai réalisé ce que je suppose être une tâche assez simple d'ajouter un UIButton supplémentaire à une vue existante avec des boutons similaires. J'ai utilisé les autres UIButtons comme modèle et il semble que ce soit une tâche simple.TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION erreur développement iPhone SDK

Le problème est lorsque la ligne qui appelle cette sous-vue est exécutée, j'obtiens le drapeau d'erreur plutôt vague de TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION. Où puis-je trouver plus d'informations sur ce code d'erreur? Je me sens comme une erreur très générale et certianly il doit y avoir quelque part dans le shell Xcode qui me donne plus de détails sur ce que cela signifie?

J'ai isolé la ligne où cela se produit et il semble se produire sur la première référence à la nouvelle vue. Est-ce un problème avec les connexions effectuées dans le constructeur d'interface? Toutes les suggestions seraient utiles car je sens vraiment que je suis en train de saisir les pailles à ce stade ...

Répondre

1

Cela signifie probablement que vous avez utilisé de la mémoire après l'avoir libéré ou utilisé sans l'initialiser. Souvent, quand vous regardez la pile après cela, tout ce que vous verrez est la partie de la boucle principale qui effectue les autoreleases, ce qui ne va pas vous aider. Vous avez vraiment besoin de bien comprendre le fonctionnement de la gestion de la mémoire dans Objective-C, puis d'examiner vos modifications. Il n'y a pas vraiment de solution miracle ici. Les bonnes nouvelles sont que cela devient plus facile avec l'expérience. Il s'agit d'un bel article sur debugging in Objective-C.

0

Quelles connexions avez-vous établies dans le constructeur d'interface? Appelez-vous des méthodes lorsque vous cliquez sur le bouton? Quelle est la signature de la méthode dans ce cas? Avez-vous apporté des modifications au code d'origine, où vous avez peut-être accidentellement supprimé du code qui était important. Cela aiderait si vous postez du code. L'exception est très générique.

1

Vous souhaitez pouvoir intercepter l'exception lorsque cela se produit, vous pouvez alors effectuer le suivi dans le débogueur. Un ensemble utile de points d'arrêt à utiliser lorsque vos applications de débogage Cocoa sont objc_exception_throw et - [NSException raise]. Dans l'iPhone, je pense que toutes les exceptions passent par objc_exception_throw mais si vous cibliez Tiger ou plus tôt, vous devriez définir un breakpoint sur les deux.

Il existe d'autres techniques de débogage à http://www.cocoadev.com/index.pl?DebuggingTechniques.

0

J'ai eu un problème similaire lorsque j'ai publié des choses que je n'avais pas explicitement allouées. Dans mon cas, j'avais une image d'arrière-plan UIImage * image = [UIImage ...] et je l'avais définie comme l'arrière-plan de mon UIButton, puis j'ai fait [image release]; Vous ne voulez pas faire la [version d'image]: le UIButton le possède maintenant, et il le libérera lorsqu'il n'est plus nécessaire. Peut-être que vous avez un problème similaire?

1

Il s'agit d'une exception générée par l'environnement d'exécution Objective-C. Appuyez sur CMD-SHIFT-R pour faire apparaître la console du débogueur. Vous verrez toutes les informations de démarrage gdb au bas de la fenêtre, mais si vous faites défiler vers le haut après les informations de la pile, vous aurez à quelque chose qui devrait ressembler à ceci:

[Session started at 2009-04-09 14:39:27 -0700.] 
2009-04-09 14:39:31.246 LearnGLES[10415:20b] *** -[EAGLContext fakeMessage]: unrecognized selector sent to instance 0x528150 
2009-04-09 14:39:31.248 LearnGLES[10415:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[EAGLContext fakeMessage]: unrecognized selector sent to instance 0x528150' 
2009-04-09 14:39:31.250 LearnGLES[10415:20b] Stack: (
    2517758219, 
    2486509115, 
    .... 

C'est juste un échantillon complet exception que j'ai faite en changeant le code pour envoyer un message inexistant à un objet, mais il y a beaucoup de possibilités quant à ce que le vôtre pourrait être. Tout ce qui pourrait générer une exception d'exécution dans l'un des frameworks Objective-C pourrait être le coupable (dates non-parseable pour un formateur de date, messages non valides pour les objets, etc ...).)