Estoy usando NSAssert() llamadas dentro de una aplicación para iPhone y mi comprensión de la Manzana docs es que las afirmaciones no son compilados en el código si NS_BLOCK_ASSERTIONS está definido.

Para desactivar afirmaciones, en un archivo de encabezado declaro: #define NS_BLOCK_ASSERTIONS

Sin embargo, la aserción de código todavía parece funcionar.

Hay algo que me estoy perdiendo aquí?

Gracias

Juan

InformationsquelleAutor John Muchow | 2011-06-22

2 Comentarios

  1. 60

    Si has creado tu proyecto de Xcode basado en una de las plantillas estándar, el Cacao encabezados (incluyendo NSException.h que contiene el NSAssert macros) obtendrá previamente procesados antes de cualquier otros archivos en el proyecto. Un #define NS_BLOCK_ASSERTIONS en cualquiera de la cabecera del proyecto o archivos de implementación por lo tanto no tiene ningún efecto sobre la NSAssert macros.

    Tratar de poner NS_BLOCK_ASSERTIONS en las macros del preprocesador de su destino o, incluso, proyecto (para la configuración de una versión solamente):

    NS_BLOCK_ASSERTIONS en Objective-C

    O poner #define NS_BLOCK_ASSERTIONS en el prefijo.pch) encabezado antes de la #import <Cocoa/Cocoa.h> o #import <Foundation/Foundation.h> líneas.

    • Agradezco la descripción minuciosa siempre, gracias!
    • Tenga en cuenta que en Xcode 4.2, las plantillas tienen esta ya preparado para usted: las afirmaciones que están bloqueados en una versión de Lanzamiento.
    • Creo que se ha cambiado de nuevo. En Xcode 5.0, el área de procesamiento de bajo configuración de compilación contiene una sección denominada «Habilitar la Fundación Afirmaciones», y los valores por defecto hay que habilitar para todas las configuraciones de compilación: AdHoc, Debug y Release.
    • En Xcode 5.0.2, las afirmaciones que están discapacitados para las versiones de Lanzamiento de forma predeterminada.
    • sin embargo, como se ha señalado aquí, prod.lists.apple.com/archives/xcode-users/2013/Oct/… a pesar de las diferentes bandera en Xcode 5, NSException.h todavía utiliza NS_BLOCK_ASSERTIONS. A ver mi pregunta, que estoy a punto de comentar stackoverflow.com/questions/20377845/…
  2. 13

    Como @dwsolberg mencionado, Xcode tiene una construcción nueva configuración llamada ENABLE_NS_ASSERTIONS. Para los nuevos proyectos de su valor para la liberación de configuración se establece en NO y para todas las otras configuraciones para YES. Esta configuración se puede usar así como el ampliamente utilizado NS_BLOCK_ASSERTIONS enfoque que sigue siendo válida en Xcode 6.

    NS_BLOCK_ASSERTIONS en Objective-C

    NS_BLOCK_ASSERTIONS en Objective-C

    Afirmaciones son una herramienta para el seguimiento de errores durante el tiempo de desarrollo y nunca debe fuego productivo de código! También las excepciones deben ser utilizados sólo si es absoloutely es necesario, es decir, si algo salió tan condenadamente mal que el programa no es capaz de continuar la ejecución. El Cacao manera es dar a los métodos críticos de un booleano valor de retorno y parametrizar con un objeto de error que se pueden establecer dentro del método y puede ser utilizado en el exterior si el valor de retorno es NO.

    Esperanza de que ayuda a algunas personas 😉

    • ¿Por qué no aserciones ser utilizado en el código de producción? Eso es como dejar en silencio la corrupción de datos en lugar de estrellarse! Si un desarrollador abusa de mi biblioteca de API se debe bloquearse por lo que él puede arreglarlo – debug o release. ¿Qué es tan especial acerca de las afirmaciones que se debe estar deshabilitado en la producción, pero otras excepciones en tiempo de ejecución se permiten?
    • Una aplicación no debe bloquearse debe controlar los errores de gracia, la captura de ellos, presente un error y, además, informe a su sistema de seguimiento de errores. Para las bibliotecas es el mismo. Usted puede enviar las versiones de depuración y de liberación de versiones de su lib. NUNCA DEJE QUE SU BLOQUEO DE LA APLICACIÓN
    • No recuperables errores no pueden ser presentados desde la aplicación está en un estado indefinido. Ya no es posible continuar con la ejecución.
    • Nunca he tenido un error de 6 Años en desarrollo de iOS, lo que no significa que no existe la posibilidad de que tal cosa puede ocurrir. Pero en ese caso se debe overthink el diseño de la aplicación y el presente de un error en una mayor (o el mayor), el nivel en la vista de jerarquía. Un accidente es el peor de lo que puede suceder a tu aplicación! Lo siento, eso es simplemente incorrecto.
    • ¿Qué pasa si se olvida de un puntero null valer y enviar mensajes a un objeto nil y se presumen todo salió bien? El resultado puede ser usuario de la corrupción de los datos. No parecen entender el concepto de «estado no definido». La aplicación puede recuperar, y no significativa error puede ser presentado. Es equivalente a un error de programación. Es como tratar de terminar un subproceso de trabajo que se colgó. Una vez que se termina el hilo, la pila no está definido y que la aplicación se bloquee independientemente de si el hilo principal está funcionando bien. Usted no puede recuperarse de ella, a menos que el subproceso en segundo plano devuelve correctamente.
    • En el mejor de los que usted puede algo como «<Aplicación> ha encontrado un error inesperado y se debe cerrar. Póngase en contacto con el fabricante para obtener ayuda.». Usted puede haber notado que algunas aplicaciones de ello.
    • Sí, yo vi esto y sigo pensando que es mala aplicación de la conducta. Cuando usted puede recuperar por estrellarse y reiniciar la aplicación, ¿por qué no puede recuperarse por la reinicialización de la jerarquía de aplicación y el estado de la aplicación en este tipo de error? Sé de bloqueo/reiniciar es conveniente, pero resettung la aplicación internamente también debería ser posible.
    • De todos modos, no sin razón, por qué Apple conjunto NS_BLOCK_ASSERTIONS en la liberación de construir la configuración como predeterminada 😉
    • Usted puede recuperar cualquier cosa, desde algo así como un hilo de terminación (pila se convierte en indefinido). El sistema operativo tiene que destruir todo el proceso y su espacio de direcciones virtuales. El «<Aplicación> cierre de error» es la «recuperación» en lugar de la congelación.

Dejar respuesta

Please enter your comment!
Please enter your name here