Pourquoi affirmer simplement de mettre fin à un programme compilé pour l'iPhone?
Je suis de débogage très assert()'ed application iPhone (Xcode, Objective-C++, et simulateur d'appareil). Dans certains cas, l'assertion de l'échec serait juste de mettre fin à l'application, au lieu de rupture dans le débogueur comme je l'avais espérer.
J'ai fait une solution de contournement, par la mise en œuvre de mon propre kinda-valoir à l'effet de:
#define AssertLite(b) if(!(b)) {asm {int 3}}
(duvet omis), mais je me demande si quelqu'un a déjà rencontré ce. Je ne pouvais pas déterminer un modèle de quand est-il de pause et quand doit-il mettre fin. Le code n'est pas fileté; tout ce qu'il fait, il le fait dans les gestionnaires d'événements.
Pourquoi est-ce possible et comment dois-je faire à la vanille assert() se comporte comme un point d'arrêt conditionnel il devrait l'être?
OriginalL'auteur Seva Alekseyev | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, puisque vous travaillez sur une application iPhone, vous devriez probablement utiliser NSAssert() à la place de la vanille BSD affirmer fonction.
par exemple
NSAssert(the_object, @"NIL object encountered");
La NSAssert macro va lancer une Objective-C d'exception (
NSInternalInconsistencyException
) si l'assertion échoue.Puisque votre objectif est de briser l'exception, la prochaine étape est de faire de l'Xcode débogueur pause sur Objective-C exceptions. C'est probablement une bonne chose à faire de toute façon.
Dans la fenêtre des points d'arrêt (Exécuter->Show->points d'arrêt de l'élément de menu), cliquez à l'endroit où il est dit "Double-Cliquez pour Symbole" pour entrer le symbole
-[NSException raise]
La dernière chose à faire attention est que NSAsserts ne pas de compiler dans un communiqué de construire. Cela signifie que vous devez être prêt à gérer l'exception dans votre application, ou vous avez besoin pour créer votre propre macro qui fait de compiler en release.
Voici la macro que j'utilise pour compiler des assertions dans l'exécution de code (notez que j'utilise ensuite HMAssert dans mon code au lieu de NSAssert):
Cela nécessite une version de DÉBOGAGE de préprocesseur macro à être défini. Voici comment le configurer:
OriginalL'auteur Michael Taylor
Tout d'abord, si vous "Ajouter une Exception de point d'arrêt..." dans le point d'arrêt Navigator (⌘6), le débogueur s'arrêter sur NSAssert des échecs, vous permettant de regarder la pile et de comprendre ce qui s'est passé.
Vous devez utiliser la norme NSAssert. Si vous l'utilisez correctement, il n'y a pas beaucoup que vous devez créer manuellement -- tout ce que Mike mention est similaire à la valeur par défaut NSAssert mise en œuvre.
Vous devriez vous lancer à la libération de configuration avec NS_BLOCK_ASSERTIONS mettre dans vos en-têtes précompilés (suivez Mike étapes), pour désactiver les assertions. Si vous avez besoin de plus d'info sur le pourquoi de le faire, découvrez: http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/
OriginalL'auteur Ohad Kravchick
Dans Xcode 4 et de la nouvelle iOS, NSAssert peut effectivement prendre une liste variable de paramètres. Ceci peut être utile pour identifier certaines des valeurs avec l'affirmer. La compilation-out assert (voir la réponse de Mike ci-dessus) pourrait être définie comme ceci:
Aussi, il n'est pas plus long terme → Voir → les points d'arrêt de l'élément de menu. Voir ce post pour configurer Xcode 4 à la pause sur une assertion telle que définie ci-dessus.
OriginalL'auteur Amiramix
Une fois j'ai vu un comportement différent de la fonction assert() appelle une fois. Il a été causé par le compilateur ramasser des différentes définitions de macro à différentes parties du processus de construction.
Une fois que les chemins d'inclusion ont été redressés, ils ont tous travaillé de la même.
OriginalL'auteur Walt Sellers