J'ai lu récemment deux conseils très intéressants:
assert
plutôt que NSAssert
... y a-t-il une raison de NE PAS utiliser assert
? (c'est moins de lettres :))Pour répondre à vos deux questions:
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.
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.)
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).