IT박스

실제로 NSAssert의 요점은 무엇입니까?

itboxs 2020. 6. 6. 08:55
반응형

실제로 NSAssert의 요점은 무엇입니까?


내가 알고있는 유일한 이유는 단언이 실패하면 앱이 중단된다는 것입니다. 이것이 NSAssert를 사용하는 이유입니까? 아니면 다른 장점은 무엇입니까? 그리고 -1을 매개 변수로받지 않아야하지만 -0.9 또는 -1.1 일 수있는 함수와 같이 코드에서 만든 가정 위에 NSAssert를 배치하는 것이 옳습니까?


주장은 가치가 예상대로 이루어 지도록하는 것입니다. 어설 션이 실패하면 문제가 발생하여 앱이 종료 된 것입니다. assert를 사용하는 한 가지 이유는 전달 된 매개 변수 중 하나가 정확히 일부 값 (또는 값 범위)이 아닌 경우 동작하지 않거나 매우 나쁜 부작용을 일으키는 기능이있는 경우 만들 수 있습니다. 가치가 당신이 기대하는 값인지 확인하십시오. 그렇지 않으면 무언가가 잘못되어 앱이 종료됩니다. Assert는 디버깅 / 단위 테스트 및 사용자가 "악한"작업을 수행하지 못하게하는 프레임 워크를 제공 할 때 매우 유용 할 수 있습니다.


NSAssert와 실제로 대화 할 수는 없지만 C의 assert ()와 유사하게 작동한다고 생각합니다.

assert ()는 코드에서 시맨틱 계약을 시행하는 데 사용됩니다. 그게 무슨 소리 야?

글쎄, 당신이 말한 것과 같습니다 : -1을 절대로받지 않아야하는 함수가 있다면 assert ()가 다음을 시행하도록 할 수 있습니다.

void gimme_positive_ints (int i) {
  주장 (i> 0);
}

이제 오류 로그 (또는 STDERR)에 다음과 같은 내용이 표시됩니다.

어설 션 i> 0 실패 : file example.c, line 2

따라서 잠재적으로 잘못된 입력을 방지 할뿐만 아니라 유용한 표준 방식으로 기록합니다.

아, 적어도 C에서는 assert ()가 매크로이므로 릴리스 코드에서 assert ()를 no-op로 다시 정의 할 수 있습니다. NSAssert (또는 더 이상 assert ())의 경우인지는 모르겠지만 해당 검사를 컴파일하는 것이 매우 유용했습니다.


모든 사람들이 위에서 말한 것 외에도 NSAssert()(C와 달리) 의 기본 동작은 assert()예외를 처리하여 잡을 수 있습니다. 예를 들어, Xcode는 이것을합니다.


NSAssert앱을 다운시키는 것 이상을 제공합니다. 클래스, 메소드 및 어설 션이 발생한 행을 알려줍니다. NS_BLOCK_ASSERTIONS를 사용하여 모든 어설 션을 쉽게 비활성화 할 수 있습니다. 따라서 디버깅에 더 적합합니다. 반면에 던지면 NSException앱이 충돌합니다. 또한 예외의 위치에 대해서는 알려주지 않으며 간단하게 비활성화 할 수 없습니다. 아래 이미지의 차이점을 참조하십시오.

NSAssert 설명서에 설명 된 대로 어설 션에서도 예외가 발생하므로 앱이 중단 됩니다.

호출되면 어설 션 핸들러는 메소드 및 클래스 이름 (또는 함수 이름)을 포함하는 오류 메시지를 인쇄합니다. 그런 다음 NSInternalInconsistencyException 예외가 발생합니다.

NSAssert :

어설 션 후 로그

NSException :

예외 후 로그


누군가가 언급했지만 완전히 설명하지 않은 것처럼 명확히하기 위해 사용자 정의 코드를 작성하는 대신 어설 션을 사용하고 사용하는 이유는 (예를 들어 if를 수행하고 잘못된 데이터에 대한 예외를 발생시키는) 프로덕션 애플리케이션에 대해 어설 션을 비활성화해야한다는 것입니다.

개발 및 디버깅 중에 오류를 포착 할 수있는 어설 션이 활성화됩니다. 어설 션이 false로 평가되면 프로그램이 중지됩니다. 그러나 프로덕션을 위해 컴파일 할 때 컴파일러는 어설 션 코드를 생략하고 실제로 프로그램 실행 속도를 높입니다. 그때까지 모든 버그를 수정했으면합니다. 생산 중에 프로그램에 여전히 버그가있는 경우 (어설 션이 비활성화되고 프로그램이 어설 션을 "스킵"하는 경우) 프로그램이 다른 지점에서 충돌 할 수 있습니다.

NSAssert의 도움에서 : "전 처리기 매크로 NS_BLOCK_ASSERTIONS가 정의되면 어설 션이 비활성화됩니다." 따라서 배포 대상에 매크로 만 넣으십시오 [전용].


NSAssert(및 그 stdlib에 상응하는 assert)는 개발 중 프로그래밍 오류를 감지하는 것입니다. 프로덕션 (릴리스 된) 응용 프로그램에서 실패한 어설 션이 없어야합니다. 따라서 양의 인수가 필요한 메소드에 음수를 전달하지 않도록 주장 할 수 있습니다. 테스트 중에 어설 션이 실패하면 버그가있는 것입니다. 그러나 전달 된 값이 사용자에 의해 입력 된 경우 프로덕션의 어설 션에 의존하지 않고 입력에 대한 올바른 유효성 검사를 수행해야합니다 (비활성화 된 릴리스 빌드에 대해 #define을 설정할 수 있음) NSAssert*.


어설 션은 일반적으로 특정 방법이나 논리를 의도적으로 사용하도록하는 데 사용됩니다. 정수가 0보다 큰 2의 합을 계산하는 방법을 작성한다고 가정 해 봅시다. 방법이 항상 의도 한대로 사용되도록하려면 해당 조건을 테스트하는 어설 션을 추가해야합니다.

짧은 대답 : 코드가 의도 한 대로만 사용되도록 강요합니다.


어설 션 프로그래밍은 런타임 검사 외에도 계약에 의해 코드를 설계 할 때 사용되는 중요한 기능이라는 점을 지적하는 것이 좋습니다.

계약에 의한 주장 및 설계 주제에 대한 자세한 정보는 아래에서 확인할 수 있습니다.

주장 (소프트웨어 개발)

계약에 의한 설계

어설 션을 사용한 프로그래밍

계약 별 설계, 예제 별 [페이퍼 백]


To fully answer his question, the point of any type of assert is to aid debugging. It is more valuable to catch errors at their source, then to catch them in the debugger when they cause crashes.

For example, you may pass a value to a function expects values in a certain range. The function may store the value for later use, and on later use the application crashes. The call stack seen in this scenario would not show the source of the bad value. It's better to catch the bad value as it comes in to find out who's passing the bad value and why.


NSAssert make app crash when it match with the condition. If not match with the condition the next statements will execute. Look for the EX below:

I just create an app to test what is the task of NSAssert is:

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self testingFunction:2];
}

-(void)testingFunction: (int)anNum{
    // if anNum < 2 -> the app will crash
    // and the NSLog statement will not execute
    // that mean you cannot see the string: "This statement will execute when anNum < 2"
    // into the log console window of Xcode
    NSAssert(anNum >= 2, @"number you enter less than 2");
    // If anNum >= 2 -> the app will not crash and the below 
    // statement will execute
    NSLog(@"This statement will execute when anNum < 2");
}

into my code the app will not crash.And the test case is:

  • anNum > = 2-> 앱이 중단되지 않고 다음 로그 문자열을 볼 수 있습니다. "이 명령문은 outPut 로그 콘솔 창에"Num <2 "일 때 실행됩니다.
  • anNum <2-> 앱이 중단되고 다음과 같은 로그 문자열을 볼 수 없습니다 : "이 명령문은 anNum <2"일 때 실행됩니다.

참고 URL : https://stackoverflow.com/questions/1375786/whats-the-point-of-nsassert-actually

반응형