단언 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 의 차이
NSAssert
와 assert
는 모두 단언 이다. 주요 한 차 이 는 assert
단언 이 실 패 했 을 때 간단 한 종료 절차 일 뿐 NSAssert
잘못된 정 보 를 보고 하고 출력 한 다 는 것 이다. 따라서 NSAssert
만 사용 하면 되 고 사용 하지 않 아 도 된다 assert
.NSAssert/NSCAssert
iOS 에서 가장 많이 사용 되 는 것 은 두 쌍 의 단언
NSAssert
/NSCAssert
과 NSParameterAssert
/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
에 적합 한 방법 이 고 _cmd
과 self
는 운행 시 와 관련 이 있 으 며 후 자 는 C
에 적용 되 는 함수 이다.NSParameterAssert
/NSCparameterAssert
이들 의 차이 도 전자 가 Objective-C
에 적용 하 는 방법 이 고 후 자 는 C
의 함수 에 적용 된다.실제 개발 에 서 는 전 자 를 쓰 면 된다.NSAssert
/NSCAssert
와 NSParameterAssert
/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'
사용자 정의 NSAssertionHandler
NSAssertionHandler
인 스 턴 스 는 자동 으로 생 성 되 어 오류 단언 을 처리 하 는 데 사 용 됩 니 다.NSAssert
와 NSCAssert
조건 이 잘못 평가 되면 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 ()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.