Qu'est-ce que NSParameterAssert?

84

C'est quoi NSParameterAssert?

Quelqu'un peut-il expliquer avec l'exemple?

senthilMuthu
la source

Réponses:

115

C'est un moyen simple de tester que le paramètre d'une méthode n'est pas nilou pas 0. Donc, fondamentalement, vous l'utilisez pour créer une précondition, indiquant qu'un paramètre doit être défini. S'il n'est pas défini, la macro entraîne l'arrêt de l'application et génère une erreur sur cette ligne. Donc:

- (void)someMethod:(id)someObjectThatMustNotBeNil
{
  // Make sure that someObjectThatMustNotBeNil is really not nil
  NSParameterAssert( someObjectThatMustNotBeNil );
  // Okay, now do things
}

Les pré-conditions sont un moyen simple de s'assurer que les méthodes / API sont correctement appelées par le programmeur. L'idée est que si un programmeur viole la condition préalable, l'application se termine tôt - espérons-le pendant le débogage et les tests de base.

NSParameterAssert peut être utilisé pour tester que toute expression est évaluée comme vraie, cependant, vous pouvez donc l'utiliser comme ceci:

NSParameterAssert( index >= 0 ); // ensure no negative index is supplied

Documentation d'Apple pour la macro NSParameterAssert ()

Jason Coco
la source
1
Assurez-vous d'attraper les exceptions dans votre code, sinon si Assert est vrai, cela plantera votre application.
lucius
14
@lucius: Les assertions ne doivent pas être utilisées pour vérifier les conditions dans une application distribuée, elles sont là pour détecter les erreurs lors du développement. Faire planter quelque chose dans un mauvais état (comme une prise non connectée à un Nib), plutôt que de tomber en panne silencieusement, vous permet de détecter les problèmes tôt. De nombreuses personnes les désactivent au moment de la distribution via des macros ou #ifdefs.
Brad Larson
5
@lucius - L'objectif est de provoquer l'abandon de l'application lorsque les conditions préalables ne sont pas remplies. Cela permet au programmeur de savoir immédiatement qu'il a fait quelque chose de mal. Pour vous assurer que les assertions dans Cocoa ne sont pas évaluées, vous pouvez définir la macro NS_BLOCK_ASSERTIONS. Cela les désactive, mais l'idée est d'empêcher les effets secondaires ou le code lent de s'exécuter plutôt que de se prémunir contre les plantages - en production, les assertions ne devraient jamais se déclencher si elles sont utilisées correctement.
Jason Coco
1
Est-il possible de supprimer ces assertions de manière simple lors des builds de production. À mon humble avis, il est préférable de les utiliser pendant le développement pour détecter les erreurs de programmation (comme mentionné dans le commentaire ci-dessus).
Johan Karlsson
5
@JohanKarlsson C'est possible, et défini par défaut dans les versions actuelles des templates (cela remonte assez loin) dans la Releaseconfiguration. Vous pouvez contrôler cela en définissant les ENABLE_NS_ASSERTIONSparamètres de construction dans les versions plus récentes de Xcode, ou en définissant la NS_BLOCK_ASSERTIONSmacro et en la définissant sur 1. Dans Xcode 5, il existe un paramètre de projet * Activer les assertions de fondation` qui définit le paramètre de construction et par défaut sur Yesin Debuget Noin Releaseconfigurations.
Jason Coco