2010-01-06 5 views
5

예기치 않은 상황이 발생하면 응용 프로그램이 빠르게 실패하고 크래시 로그에서 의미있는 메시지와 충돌하여 내 iPhone 응용 프로그램 전체에 NSAssert을 사용하려고합니다.스레드의 NSAssert 사용

NSAssert이 기본 스레드 인 경우 NSInternalInconsistencyException가 발생하여 실행이 중지되고 정상적으로 실행되면 정상적으로 작동합니다. 그러나 백그라운드 스레드에서 처리를하고 있는데이 경우 NSAssert은 스레드를 중단하고 프로그래밍은 계속 실행됩니다.

- (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]; 
    } 
} 

이 더 나은 방법이 있나요 :

나의 현재 솔루션 (NSOperationmain 방법이 경우에) 잡아 주 스레드에서 예외를 다시 발생하는 것입니다? 아마도 사용자 지정 NSAssertionHandler를 사용하고 있을까요?

는 난 그냥 정적 주석 C의 assert를 사용할 수 있습니다 알고

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

하지만이 날 x의 실제 실패 값이 무엇인지 보여 허용하지 않습니다.

+0

동일한 문제가 발생하지만 제안 된 솔루션이 나를 위해 작동하지 않습니다. NSAssert가 실행 중이며 스레드는 종료되지만 응용 프로그램은 계속 실행됩니다. Cocos2D 엔진을 사용하고 있습니다. 누구보다 완벽한 솔루션을 제공 할 수 있습니까? –

답변

1

NSAssert을 테스트 코드로 대체 한 다음 예외 인상을 수행 할 수 있습니다. 이렇게하면 어설 션이 실패하면 예외가 throw되고 @catch 블록에 캐치되어 주 스레드에서 다시 발생합니다.

참고 : 소형 폼을 제공하기 위해 C 매크로를 정의 할 수도 있습니다.

+0

NSAssert는 기본적으로 NSInternalInconsistencyException을 발생시킵니다. 위의 catch/re-raise 솔루션을 옹호하고 있습니까? – sickp

+0

설명서를 다시 읽었으며 NSAssert에서 예외가 발생합니다. 그래서 현재의 솔루션이 옳은 것처럼 보입니다. –