2010-01-06 8 views
5

Estoy intentando usar NSAssert en toda la aplicación de mi iPhone para que, si ocurre una condición inesperada, la aplicación falle rápidamente y se cuelgue con un mensaje significativo en el registro de fallos.Uso de NSAssert en subprocesos

Esto funciona bien si el error NSAssert se encuentra en el hilo principal, ya que aumenta NSInternalInconsistencyException de forma predeterminada, lo que no se detecta y detiene la ejecución. Pero también estoy procesando en subprocesos de fondo, en cuyo caso el NSAssert acaba abortando el hilo, pero la programación sigue ejecutándose.

Mi solución actual es coger y volver a lanzar la excepción en el hilo principal (en este caso, NSOperation 's main método):

- (void)main { 
    @try { 
     int x = 14; 
     ... 
     NSAssert1(x > 20, @"x should be greater than 20, was %d", x); 
     ... 
    } 
    @catch (NSException *e) { 
     [e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES]; 
    } 
} 

¿Hay una mejor manera? Tal vez usando un NSAssertionHandler personalizado?

sé que sólo podía utilizar C de assert con una anotación estática:

assert(x > 20 && "x should be greater than 20"); 

pero esto no me permitirá mostrar cuál es el valor real de fracaso es x.

+0

Estoy teniendo el mismo problema, pero la solución propuesta no funcionará para mí. El NSAssert se activa, el hilo muere, pero la aplicación continúa ejecutándose. Estoy usando el motor Cocos2D. ¿Alguien podría proporcionar una solución más completa? –

Respuesta

1

Puede reemplazar el NSAssert con un código de prueba seguido de un aumento de excepción. De esta forma, si la afirmación falla, se generará una excepción atrapada por el bloque @catch y se volverá a generar en el hilo principal.

Nota: Incluso puede definir una macro C para proporcionar una forma compacta.

+0

Esto es lo que NSAssert hace de manera predeterminada: genera una NSInternalInconsistencyException. ¿Entonces defiende la solución catch/re-raise anterior? – sickp

+0

He vuelto a leer la documentación y NSAssert genera una excepción. Entonces su solución actual parece correcta. –

Cuestiones relacionadas