web-dev-qa-db-fra.com

Xcode lève une exception dans Main () dans iOS 8 avec un point d'arrêt 'toutes les exceptions'

J'utilise Xcode 6 (GM, je n'ai pas téléchargé de bêta) et je développe des applications pour iOS 7+. Pour tous mes projets, je viens d’ouvrir les mêmes projets que ceux sur lesquels je travaillais dans Xcode 5.

Dans le navigateur de points d'arrêt, le point d'arrêt All Exceptions est activé. Il est défini sur Break: On Throw. Maintenant, chaque fois que j'exécute mon application (que ce soit sur un appareil ou dans un simulateur), elle arrête l'exécution sur la ligne return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); dans la fonction main()

Si j'appuie sur Play pour continuer l'exécution du programme deux fois, le programme fonctionne correctement. Cela ne m'empêche donc pas de travailler, mais il est embêtant de devoir exécuter manuellement l'exécution à chaque fois et de réinitialiser mes éditeurs.

J'aime les comportements que j'ai définis dans Xcode (en prenant l'éditeur actuel à l'endroit où l'exécution a été suspendue), et avoir ce point d'arrêt All Exceptions est un élément important de l'OMI. (Donc, je ne veux pas changer ceux-ci)

En exécutant le même code, avec les mêmes environnements, pour une cible iOS 7 (à nouveau, un périphérique ou un simulateur), l'exception n'est pas levée.

Une idée de ce qui pourrait causer ce comportement étrange?

49
invalidArgument

Comme indiqué dans les commentaires, vous devez désactiver la capture des exceptions C++ en modifiant votre point d'arrêt Toutes les exceptions

Pour ce faire, faites un clic droit sur votre point d'arrêt et modifiez Exception deAllenObjective-C:

change All to Objective-C

Les exceptions dans le code C++ font partie des fonctionnalités normales de l'application. Cependant, le point d'arrêt d'exception n'attrape pas les applications non gérées, mais toutes les exceptions levées, même lorsqu'elles sont correctement gérées ultérieurement, d'où l'arrêt de l'exécution.

98
Johnnywho

TLDR; Dans mon cas, la cause du problème était l'absence de polices.

J'ai aussi eu ce problème. Bien que @Johnnywho ait raison de ne laisser le point indésirable que dans Exception Breakpoint pour Objective-C uniquement, il n'explique toujours pas quelle est la véritable cause, pourquoi s'exécute-t-il sans exception sur iOS7 et pourquoi cela ne se produit-il que sur certains projets.

C'est pourquoi j'ai poursuivi et disséqué l'un de mes projets dans lequel j'avais ce problème, jusqu'au point où j'ai pu en trouver la cause. Je suppose qu'il pourrait y avoir plus d'une cause à ce problème, mais dans mon cas, il manquait des polices personnalisées.

Moyen rapide de le tester:

  1. Démarrer un nouveau projet à vue unique

  2. Activer le point d'arrêt sur toutes les exceptions, y compris C++ (Points d'arrêt/+/Ajouter un point d'arrêt d'exception)

  3. Faites glisser dans le projet des polices personnalisées (autorisez la copie et cochez la cible pour l'ajouter)

  4. Ajouter une étiquette à la vue dans le contrôleur de vue principal

  5. Choisissez la police personnalisée pour votre étiquette (sous Xcode 6+, elle devrait apparaître dans le sélecteur de polices dès que vous la faites glisser dans le projet).

  6. Lancez l’application et confirmez que vous voyez l’étiquette dans votre police personnalisée (il semble que nous n’ayons plus besoin d’ajouter le nom du fichier de police dans Info.plist pour la clé "Polices fournies par l’application", si la police personnalisée a été utilisée. utilisé dans un storyboard de xib de l'application).

  7. Supprimez maintenant la police personnalisée de votre projet (soit en désélectionnant la relation cible, soit en la supprimant dans les paramètres cible/Construire les phases/Copier les ressources de l'ensemble).

  8. Supprimer l'application de votre appareil ou de votre sim (pour supprimer le fichier de police de l'ensemble d'applications)

  9. Produit/Propre

  10. Exécutez à nouveau l’application (l’étiquette a toujours la référence à la police personnalisée, mais l’application ne contient pas le fichier correspondant). Vous devriez remarquer l’exception mystérieuse si vous utilisez iOS8.

  11. Exécutez l'application sur l'appareil avec iOS7 ou sim avec iOS7 (vous devrez pour cela modifier la cible de déploiement iOS en iOS7). Bien que l'étiquette n'indique pas la police personnalisée, il n'y aura pas d'exception.

  12. Ajoutez le fichier de police à la cible et le point d'arrêt ne s'arrête plus à l'exécution.

Donc, ma conclusion est que sur iOS8, les polices manquantes provoquent une exception C++ alors que sur iOS7, ce n'est pas le cas, d'où le déclenchement du point d'arrêt.

Une exception similaire (et un déclencheur de point d'arrêt) peut également être provoquée par un nom de fichier de police mal écrit dans le fichier Info.plist sous la clé "Polices fournies par l'application".

29
Andris Zalitis

Je viens de résumer les réponses précédentes qui m'ont aidé à résoudre le problème.

Problème: lorsque vous ajoutez une police personnalisée, puis que vous la supprimez (remplacez), quelque part dans le projet est toujours sa référence et le point d'arrêt s'arrête plusieurs fois au point d'arrêt principal de la bibliothèque C++ dans iOS 8.

Solutions

1) Recherchez dans le projet et supprimez (remplacez) toutes les références à ces polices. Peut-être dans certaines plumes, sous-modules, etc…

2) Si vous ne pouvez pas réparer partout (par exemple, les bibliothèques en lecture seule les utilisent) ou si le problème persiste après la solution 1, rajoutez ces anciennes polices au projet.

3) l'ignorer - c'est une librairie C++ alors changez l'exception de point d'arrêt de "Tous" à "Objective-C" uniquement

3

Xcode 9, parfois, des exceptions sont levées mais iOS le détecte avec élégance. CA aidera

 enter image description here

 enter image description here

la source

dans mon cas, il s'agissait d'un attribut défini par l'utilisateur dans nib

2
Ted

J'ai eu un même problème, le problème était que j'ai ajouté des fichiers d'interface d'un autre projet qui a une police différente. Il suffit de les trouver et de les supprimer.

0
Sunil Kumar