programing

NSA sert의 요점이 뭐죠?

lastcode 2023. 6. 21. 22:39
반응형

NSA sert의 요점이 뭐죠?

이 질문은 다음과 같습니다.제가 아는 유일한 것은 주장이 실패하면 앱이 충돌한다는 것입니다.그게 NSA sert를 사용하는 이유입니까?아니면 그것의 또 다른 이점은 무엇입니까?그리고 NSA sert를 코드에서 내가 가정하는 어떤 것보다 바로 위에 두는 것이 옳은가요? 예를 들어 -1을 매개변수로 받아서는 안 되지만 -0.9 또는 -1.1을 받을 수 있는 함수와 같은 것입니다.

Assert는 값이 원래 있어야 하는 값인지 확인하는 것입니다.어설션이 실패하면 문제가 발생하여 앱이 종료됩니다.assert를 사용하는 한 가지 이유는 전달된 매개 변수 중 하나가 정확하게 어떤 값(또는 값 범위)이 아닐 경우 동작하지 않거나 매우 나쁜 부작용을 일으킬 수 있는 함수가 있을 경우 assert를 입력하여 값이 예상한 값인지 확인할 수 있으며 그렇지 않으면 무언가가 정말 잘못되었기 때문입니다.Assert는 디버깅/유닛 테스트 및 사용자가 "악의" 작업을 수행하지 못하도록 하는 프레임워크를 제공하는 경우에도 매우 유용합니다.

NSAssert와 대화할 수는 없지만, C의 주장()과 유사하게 작동한다고 생각합니다.

assert()는 코드에서 의미 계약을 시행하는 데 사용됩니다.그게 무슨 뜻이냐고요?

음, 당신이 말한 것처럼: 만약 당신이 절대로 -1을 받아서는 안 되는 기능을 가지고 있다면, 당신은 주장()이 다음을 시행하도록 할 수 있습니다.

void gimme_positive_ints(inti) {assert(i > 0);}

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

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

따라서 잠재적으로 불량한 입력으로부터 안전하게 보호할 뿐만 아니라 유용하고 표준적인 방식으로 로그를 기록합니다.

아, 그리고 적어도 C에서 assert()는 매크로였기 때문에 assert()를 릴리스 코드의 no-op로 재정의할 수 있습니다.NSAssert(또는 더 이상 주장()의 경우인지는 모르겠지만, 그러한 검사를 편집하는 것은 꽤 유용했습니다.

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

NSAssert 문서에서 다음과 같이 주장을 통해 예외가 발생하기 때문에 앱이 충돌합니다.

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

NSA sert:

Logs after an assertion

NS 예외:

Logs after an exception

과는 별개로, 사말것별한개과로행는이동, 기본의모람의 .NSAssert()의 (C와 달리)와 달리)assert()으로, 할 수 는 예외를 던지는 것으로, 사용자가 잡고 처리할 수 있습니다.예를 들어, Xcode는 이를 수행합니다.

누군가가 언급했지만 완전히 설명하지 않은 것처럼 사용자 지정 코드를 만드는 대신 assert를 사용하고 사용하는 이유(예: 잘못된 데이터에 대해 if를 수행하고 예외를 제기)는 프로덕션 애플리케이션에서 assert를 사용하지 않도록 설정해야 한다는 것입니다.

개발 및 디버깅하는 동안 오류를 탐지할 수 있는 어설션이 활성화됩니다.어설션이 거짓으로 평가되면 프로그램이 중지됩니다.그러나 프로덕션을 위해 컴파일할 때 컴파일러는 어설션 코드를 생략하고 실제로 프로그램을 더 빠르게 실행합니다.그때까지, 바라건대, 당신은 모든 버그를 고쳤습니다.프로그램이 운영 중인 동안 버그가 있는 경우(어설션이 비활성화되고 프로그램이 어설션을 "넘겨" 어설션이 발생할 경우) 다른 시점에서 프로그램이 중단될 수 있습니다.

NSssert의 도움말에서: "사전 처리기 매크로 NS_BLOCK_ASSERTES가 정의된 경우 인수가 비활성화됩니다."따라서 배포 대상 [only]에 매크로를 넣기만 하면 됩니다.

NSAssert 해당 (stdlib 등가당해및물d등및▁(가▁st물▁itsassert는 개발 는 개발 중에 프로그래밍 오류를 탐지하는 것입니다.프로덕션(릴리스) 응용 프로그램에서 실패하는 어설션을 사용해서는 안 됩니다.따라서 긍정적인 인수가 필요한 방법에는 음수를 절대 전달하지 않는다고 주장할 수 있습니다.테스트하는 동안 어설션이 실패하면 버그가 발생합니다.할 수 ).NSAssert*.

어설션은 일반적으로 특정 방법이나 논리의 의도된 사용을 시행하는 데 사용됩니다.0보다 큰 두 정수의 합을 계산하는 방법을 쓰고 있었다고 가정해 보겠습니다.방법이 항상 의도한 대로 사용되었는지 확인하기 위해 해당 조건을 테스트하는 어설션을 지정할 수 있습니다.

단답:그들은 당신의 코드가 의도한 대로만 사용되도록 강제합니다.

런타임 검사 외에도 프로그래밍은 계약별로 코드를 설계할 때 사용되는 중요한 기능이라는 점을 지적할 가치가 있습니다.

계약별 주장 및 설계 주제에 대한 자세한 내용은 아래에서 확인할 수 있습니다.

어설션(소프트웨어 개발)

계약에 의한 설계

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

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

그의 질문에 완전히 답하기 위해, 모든 종류의 주장의 요점은 디버깅을 돕는 것입니다.오류를 소스에서 감지한 다음 충돌을 일으킬 때 디버거에서 오류를 감지하는 것이 더 중요합니다.

예를 들어, 특정 범위의 함수 기대값에 값을 전달할 수 있습니다.이 기능은 나중에 사용할 수 있도록 값을 저장하고 나중에 응용 프로그램 충돌을 사용할 수 있습니다.이 시나리오에서 볼 수 있는 콜 스택은 잘못된 값의 소스를 표시하지 않습니다.누가 왜 나쁜 값을 넘겼는지는 들어오는 대로 잡는 것이 좋습니다.

NSAssert조건과 일치할 때 앱을 중지합니다.조건과 일치하지 않으면 다음 문이 실행됩니다.아래 EX를 찾습니다.

나는 단지 무엇의 작업인지 테스트하기 위해 앱을 만들 뿐입니다.NSAssert다음과 같습니다.

    - (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");
}

내 코드에 앱이 충돌하지 않을 것입니다.테스트 사례는 다음과 같습니다.

  • anNum>= 2 -> 앱이 충돌하지 않고 로그 문자열을 볼 수 있습니다:"이 문은 OutPut 로그 콘솔 창에 숫자 < 2"가 들어갈 때 실행됩니다.
  • anNum< 2 -> 앱이 충돌하여 로그 문자열을 볼 수 없습니다:"이 문은 Num < 2"일 때 실행됩니다.

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

반응형