¿Qué es NSParameterAssert?

84

¿Qué es NSParameterAssert?

¿Alguien puede explicarlo con un ejemplo?

senthilMuthu
fuente

Respuestas:

115

Es una forma sencilla de probar que el parámetro de un método no es 0 nilo no. Básicamente, lo usa para crear una condición previa, indicando que se debe establecer algún parámetro. Si no se establece, la macro hace que la aplicación se anule y genera un error en esa línea. Entonces:

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

Las condiciones previas son una forma sencilla de garantizar que el programador llame correctamente a los métodos / API. La idea es que si un programador viola la condición previa, la aplicación finaliza antes, con suerte durante la depuración y las pruebas básicas.

NSParameterAssert Sin embargo, se puede usar para probar que cualquier expresión se evalúe como verdadera, por lo que también puede usarla así:

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

Documentación de Apple para la macro NSParameterAssert ()

Jason Coco
fuente
1
Asegúrese de detectar excepciones en su código; de lo contrario, si Assert es verdadero, bloqueará su aplicación.
lucius
14
@lucius: Las afirmaciones no deben usarse para verificar las condiciones en una aplicación distribuida, están ahí para detectar errores durante el desarrollo. Hacer que algo se bloquee en malas condiciones (como una toma de corriente desconectada a una punta), en lugar de fallar silenciosamente, le permite encontrar problemas temprano. Mucha gente los desactiva en el momento de la distribución mediante macros o #ifdefs.
Brad Larson
5
@lucius: el objetivo es hacer que la aplicación se anule cuando no se cumplen las condiciones previas. Esto le permite al programador saber inmediatamente que ha hecho algo mal. Para asegurarse de que las afirmaciones en Cocoa no se evalúen, puede definir la macro NS_BLOCK_ASSERTIONS. Esto los deshabilita, pero la idea es evitar que los efectos secundarios o el código lento se ejecuten en lugar de evitar que se bloqueen; por producción, las afirmaciones nunca deberían activarse si se usan correctamente.
Jason Coco
1
¿Es posible eliminar estas afirmaciones de una manera sencilla al realizar compilaciones de producción? En mi humilde opinión, estos se utilizan mejor durante el desarrollo para detectar errores de programación (como se menciona en el comentario anterior).
Johan Karlsson
5
@JohanKarlsson Es posible, y se establece por defecto en las versiones actuales de las plantillas (esto se remonta bastante atrás) en la Releaseconfiguración. Puedes controlar esto configurando la ENABLE_NS_ASSERTIONSconfiguración de compilación en las versiones más recientes de Xcode, o definiendo la NS_BLOCK_ASSERTIONSmacro y configurándola en 1. En Xcode 5 hay una configuración de proyecto * Habilitar Foundation Assertions` que establece la configuración de compilación y los valores predeterminados Yesen Debugy Noen Releaseconfiguraciones.
Jason Coco