단언 Assertion

단언 이란 무엇 인가
프로 그래 밍 에서 단언 (assertion) 은 프로그램 에 놓 인 1 단계 논리 (예 를 들 어 결과 가 진실 이거 나 가짜 논리 판단 식) 로 프로그램 개발 자가 예상 한 결 과 를 표시 하고 검증 하기 위 한 것 이다.
- 프로그램 이 단언 의 위치 로 실 행 될 때 해당 하 는 단언 은 진실 이 어야 합 니 다.사실 이 아니 라 고 단언 하면 프로그램 이 실행 을 중단 하고 오류 메 시 지 를 보 냅 니 다.
단언 을 사용 하 다
  • 예상 되 는 상황 을 오류 처리 코드 로 처리 하고 발생 하지 말 아야 할 상황 을 단언 으로 처리 합 니 다.
  • 실행 해 야 할 코드 를 단언 에 넣 는 것 을 피한다
  • 단언 으로 전 조건 과 후 조건 을 주석 하고 검증
  • 건장 한 코드 에 대해 서 는 단언 을 사용 한 다음 에 오 류 를 처리 해 야 한다
  • .
    내부 시스템 에서 유래 한 신뢰 할 수 있 는 데이터 에 대해 서 는 외부 에서 신뢰 할 수 없 는 데이터 에 대해 서 는 단언 을 사용 하지 말고 외부 에서 신뢰 할 수 없 는 데이터 에 대해 서 는 오류 처리 코드 를 사용 해 야 합 니 다.단언 은 실행 가능 한 주석 으로 볼 수 있다.
    시스템 외부의 데이터 (사용자 입력, 파일, 네트워크 읽 기 등) 는 모두 믿 을 수 없 으 며, 엄격하게 검사 (일반적으로 오류 처리) 해야만 시스템 내부 로 보 낼 수 있다. 이것 은 수비 에 해당 한다.
    한편, 시스템 내부 의 상호작용 (예 를 들 어 서브루틴 호출) 에 대해 매번 입력 한 데 이 터 를 처리 하면 시스템 이 신뢰 할 수 있 는 경계 가 없 는 것 과 같 고 코드 를 비대 하고 복잡 하 게 만 들 수 있다.실제로 시스템 내부 에서 서브루틴 이 예상 하 는 적절 한 데 이 터 를 전달 하 는 것 은 호출 자의 책임 이 고 시스템 내 호출 자 는 서브루틴 에 전달 하 는 데 이 터 를 확보 하 는 것 이 적절 하고 정상 적 인 작업 을 할 수 있 도록 해 야 한다.이렇게 되면 신뢰 할 수 없 는 외부 환경 과 신뢰 할 수 있 는 시스템 내부 환경 을 격 리 시 켜 복잡 도 를 낮 춘 다.
    그러나 개발 단계 에서 코드 는 결함 을 포함 할 수 있 습 니 다. 외부 데 이 터 를 처리 하 는 프로그램 이 주도면밀 하지 못 한 것 일 수도 있 습 니 다. 시스템 내부 서브루틴 을 호출 하 는 코드 에 오류 가 있어 서브루틴 호출 에 실 패 했 을 수도 있 습 니 다.이 럴 때 단언 은 그 부분 에 문제 가 생 겨 서브루틴 호출 이 실 패 했 는 지 확인 하 는 데 도움 이 된다.모든 결함 을 정리 한 후에 내외 에 다른 신용 체계 가 세 워 졌 다.발행 판 이 나 올 때 까지 이 단언 들 은 필요 없 을 것 이다.
    iOS
    iOS 개발 에 서 는 매크로 NSAssert() 를 사용 해 프로그램 에서 단언 처리 할 수 있다.NSAssert() 사용 이 정확 하여 개발 자가 빨리 BUG 를 찾 을 수 있 도록 도와 줄 수 있 습 니 다.개발 자 는 프로그램의 모든 버 전에 서 단언 검 사 를 할 필요 가 없습니다. 대부분의 프로젝트 는 두 가지 버 전이 있 기 때 문 입 니 다. Debug 버 전과 Release 버 전 입 니 다.Debug 버 전에 서 개발 자 는 모든 단언 을 검사 하 기 를 원 하지만 Release 버 전에 서 는 단언 검 사 를 사용 하지 않 습 니 다.
    NSAssert () 는 이렇게 정의 합 니 다.
     #define NSAssert(condition, desc)

    condition 은 조건 식 이 고 값 은 YES 또는 NO 입 니 다.desc 는 보통 NSString 입 니 다.conditon 이 YES 일 때 프로그램 이 계속 실행 되 고 NO 일 때 desc 설명 이 있 는 이상 정 보 를 던 집 니 다.NSAssert () 는 프로그램의 어느 위치 에 나 나타 날 수 있 습 니 다.
    Release 버 전에 서 단언 을 사용 하지 않 는 방법 은 다음 과 같 습 니 다. Build Settings 메뉴 에서 Preprocessor Macros 항목 을 찾 으 십시오. Preprocessor Macros 항목 아래 에 프로그램 생 성 설정 이 있 습 니 다. Debug 버 전과 Release 버 전 입 니 다.Release 항목 을 선택 하고 설정 NS_BLOCK_ASSERTIONS 을 선택 하 며 단언 검 사 를 하지 않 습 니 다.아래 그림 과 같다.
    NSAssert 와 assert 의 차이NSAssertassert 는 모두 단언 이다. 주요 한 차 이 는 assert 단언 이 실 패 했 을 때 간단 한 종료 절차 일 뿐 NSAssert 잘못된 정 보 를 보고 하고 출력 한 다 는 것 이다. 따라서 NSAssert 만 사용 하면 되 고 사용 하지 않 아 도 된다 assert.
    NSAssert/NSCAssert
    iOS 에서 가장 많이 사용 되 는 것 은 두 쌍 의 단언 NSAssert/NSCAssertNSParameterAssert/NSCparameterAssert 이다. 그들의 차 이 를 알 고 싶다 면 먼저 그들의 정 의 를 살 펴 보 자.
    #if !defined(NS_BLOCK_ASSERTIONS)
        #if !defined(_NSAssertBody)
        #define NSAssert(condition, desc, ...)  \\\\
        do {              \\\\
        __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \\\\
        if (!(condition)) {       \\\\
        [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \\\\
        object:self file:[NSString stringWithUTF8String:__FILE__] \\\\
        lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \\\\
        }             \\\\
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \\\\
        } while(0)
        #endif
        #if !defined(_NSCAssertBody)
        #define NSCAssert(condition, desc, ...) \\\\
        do {              \\\\
        __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \\\\
        if (!(condition)) {       \\\\
        [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \\\\
        file:[NSString stringWithUTF8String:__FILE__] \\\\
        lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \\\\
        }             \\\\
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \\\\
        } while(0)
        #endif

    정 의 를 통 해 알 수 있 듯 이 전 자 는 Objective-C 에 적합 한 방법 이 고 _cmdself 는 운행 시 와 관련 이 있 으 며 후 자 는 C 에 적용 되 는 함수 이다.NSParameterAssert/NSCparameterAssert 이들 의 차이 도 전자 가 Objective-C 에 적용 하 는 방법 이 고 후 자 는 C 의 함수 에 적용 된다.실제 개발 에 서 는 전 자 를 쓰 면 된다.NSAssert/NSCAssertNSParameterAssert/NSCparameterAssert 의 차 이 는 전 자 는 조건 에 대한 단언 이 고 후 자 는 매개 변수 가 존재 하 는 지 에 대한 단언 일 뿐 디 버 깅 할 때 결합 하여 사용 할 수 있 으 며 먼저 매개 변 수 를 판단 한 다음 에 단언 하여 원인 을 확인 할 수 있다.
    NSAssert 의 용법
    int a = 1;
        //         ,            ,             
        NSCAssert(a == 2, @"a must equal to 2"); 

    실행 하면 충돌 하고 콘 솔 에서 다음 과 같은 정 보 를 출력 합 니 다.
    *** Assertion failure in -[ViewController viewDidLoad](), /Users/user/Desktop/MYAssert/MYAssert/ViewController.m:32
    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'a must equal to 2'

    NSParameterAssert 의 용법
    - (void)assertWithPara:(NSString *)str {
        //        ,            ,      ,         
       NSParameterAssert(str); 
       // further code ...
    }
    

    호출 방법 assert WithPara: 입력 인자 가 비어 있 으 면 다음 로그 가 있 습 니 다.
    *** Assertion failure in -[ViewController assertWithPara:], /Users/user/Desktop/MYAssert/MYAssert/ViewController.m:45
    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: str'

    사용자 정의 NSAssertionHandlerNSAssertionHandler 인 스 턴 스 는 자동 으로 생 성 되 어 오류 단언 을 처리 하 는 데 사 용 됩 니 다.NSAssertNSCAssert 조건 이 잘못 평가 되면 NSAssertionHandler 인 스 턴 스 에 잘못된 문자열 을 보 냅 니 다.모든 스 레 드 에는 자신의 NSAssertionHandler 인 스 턴 스 가 있다.단언 을 사용 할 때 콘 솔 출력 이 잘못 되 었 지만 프로그램 이 직접 무 너 지지 않 습 니 다.
    
    #import "MyAssertHandler.h"
    
    @implementation MyAssertHandler
    
    //   Objective-C   
    - (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,... {
        NSLog(@"NSAssert Failure: Method %@ for object %@ in %@#%li", NSStringFromSelector(selector), object, fileName, (long)line);
    }
    //  C   
    - (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,... {
        NSLog(@"NSCAssert Failure: Function (%@) in %@#%li", functionName, fileName, (long)line);
    }
    
    @end
    

    스 레 드 에 처리 클래스 추가
    NSAssertionHandler *myHandler = [[MyAssertHandler alloc] init];
    //       
    [[[NSThread currentThread] threadDictionary] setValue:myHandler
    forKey:NSAssertionHandlerKey];

    NSAssertion Handler 를 사용자 정의 하면 프로그램 이 실패 한 후 정 보 를 얻 을 수 있 지만 프로그램 은 계속 실행 할 수 있 으 며 강제로 프로그램 을 종료 하지 않 습 니 다.
    참고:
    단언(프로그램)
    단언 (NSAssert) 사용
    iOS 개발 에서 단언 하 는 사용 - NSAssert ()

    좋은 웹페이지 즐겨찾기