[ios] 실제로 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 실패 : 파일 example.c, 2 행

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

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


답변

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

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

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

NSAssert :

어설 션 후 로그

NSException :

예외 후 로그


답변

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


답변

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

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

NSAssert의 도움말에서 : “전 처리기 매크로 NS_BLOCK_ASSERTIONS가 정의되면 어설 션이 비활성화됩니다.” 따라서 배포 대상에 매크로를 넣으면됩니다.


답변

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


답변

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

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