web-dev-qa-db-fra.com

NSAssert vs assert: lequel utilisez-vous et quand?

J'ai lu récemment deux conseils très intéressants:

  1. Dans les commentaires à cette réponse StackOverflow , @Mike Weller dit de laisser vos affirmations dans le code de production ... quelle est la performance atteinte, vraiment? Y a-t-il une raison de NE PAS les laisser?
  2. Dans blog de Vincent Gable , il déclare que vous devriez préférer assert plutôt que NSAssert... y a-t-il une raison de NE PAS utiliser assert? (c'est moins de lettres :))
50
Dan Rosenstark

Pour répondre à vos deux questions:

  1. Il ne devrait y avoir que très peu de performances pour quitter dans une assertion, sauf si l'action réelle dans l'assertion prend beaucoup de temps (par exemple assert([obj calculateMeaningOfLife] == 42)). Une assertion ne doit pas être différente d'une instruction if supplémentaire, en termes de performances. La raison de la suppression des assertions dans les versions de versions est qu'elles sont essentiellement un outil de débogage - elles capturent un état de programme interne incohérent au moment de l'exécution. Du point de vue du développeur, il est beaucoup mieux pour une application de se bloquer dès que quelque chose ne va pas, mais du point de vue de l'utilisateur, il est sans doute moins ennuyeux si l'application ne plante pas (sauf si le fait de laisser l'application s'exécuter avec un état anormal provoque quelque chose d'horrible. ), et exposer les détails du développement dans des messages d'erreur peut être rebutant. Il y a de bons arguments des deux côtés - si je me souviens bien, Code Complete recommande de les supprimer mais The Pragmatic Programmer recommande de les laisser dedans. En tout cas, les assertions ne sont pas un substitut pour une gestion correcte des erreurs et ne doit être utilisé que pour les erreurs de programmation.

  2. La différence de base entre un NSAssert et un assert normal est qu'un NSAssert déclenche une exception lorsqu'il échoue tandis qu'un assert plante simplement l'application. NSAssert vous permet également de fournir des messages d'erreur plus sophistiqués et de les enregistrer. Pratiquement, je ne pense vraiment pas qu'il y ait beaucoup de différence entre les deux - je ne peux pas penser à une raison pour gérer une exception levée par une assertion. (Pour diviser les cheveux, je pense que NSAssert implique généralement moins de frappe car vous n'avez pas besoin d'inclure assert.h, mais ce n'est ni ici ni là-bas.)

56
shosti

La macro NSAssert () doit être utilisée uniquement dans les méthodes Objective-C.

NSAssert () est désactivé si la macro de préprocesseur NS_BLOCK_ASSERTIONS est définie (généralement dans la version finale).

4
Freeman