50 votes

NSAssert vs assert: Lequel utilisez-vous et quand?

J'ai lu deux de vraiment intéressant morceaux de conseils, récemment:

  1. Dans les commentaires de ce StackOverflow réponse, @Mike Weller dit de laisser votre affirme dans le code de production... quel est l'impact sur les performances, vraiment? Est-il une raison de ne PAS les laisser dans?
  2. Dans Vincent Pignon du blog, il indique que vous devez préférer assert sur NSAssert... est-il une raison de ne PAS utiliser assert? (c'est de moins en moins de lettres :))

56voto

shosti Points 4672

Pour répondre à vos deux questions:

  1. Il devrait y avoir très peu de performances pour les laissant dans une assertion, à moins que l'action réelle dans l'affirmation de temps (par exemple, assert([obj calculateMeaningOfLife] == 42)). Une affirmation devrait être pas différente de celle d'un extra - if déclaration, en terme de performance. La raison de la suppression des assertions dans les versions release, c'est qu'ils sont essentiellement un outil de débogage-ils attraper incompatible programme interne de l'état au moment de l'exécution. À partir d'un point de vue développeur, c'est beaucoup mieux pour une application crash dès que quelque chose va mal, mais à partir d'un point de vue utilisateur, c'est sans doute moins gênant si l'application ne plante pas (à moins de laisser l'exécution de l'application avec un état anormal provoque quelque chose d'horrible à arriver), et d'exposer le développement de détails dans les messages d'erreur peut être rebutant. Il existe de bons arguments des deux côtés--si je me souviens bien, le Code Complet recommande de les dépouiller, mais La Pragmatique Programmeur recommande de les laisser dans. Dans tous les cas, les affirmations ne sont pas un substitut à une bonne gestion des erreurs et doit être utilisé uniquement pour les erreurs de programmation.

  2. La différence fondamentale entre un NSAssert et assert , c'est qu'un NSAssert soulève une exception lorsqu'il échoue tandis qu'un assert seulement bloque l'application. NSAssert vous permet également d'approvisionnement amateur de messages d'erreur et les journaux eux. Pratiquement, je ne pense vraiment pas qu'il y a beaucoup de différence entre les deux, je ne peux pas penser à une raison pour traiter une exception levée par une assertion. (Couper les cheveux en quatre, je pense que NSAssert implique généralement moins de frappe parce que vous n'avez pas à inclure assert.h, mais c'est ni ici ni là-bas.)

4voto

Freeman Points 1725

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X