Objective-C 범주에서이 흥미로운 코드를 발견했습니다.이 범주는 NSExceptions를 잡아 내고이를 Swift 코드에 NSErrors로 전달하는 데 사용됩니다.Objective-C try-catch - 왜 이것을 컴파일합니까? 그리고 왜 다른 반환 디버그 대 릴리스 디버그입니까?
내가 이해할 수없는 내용은 다음과 같습니다. 1) 컴파일하는 이유는 무엇입니까? 예외가 발생하면 반환 값이 없습니다. 2) 디버그 (최적화 레벨 없음) 및 릴리스 (최적화 레벨 최소/가장 빠름)로 컴파일 할 때 반환 값이 다른 이유는 무엇입니까?
- (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error {
@try {
tryBlock();
return YES;
}
@catch (NSException *exception) {
NSMutableDictionary *userInfo = [exception.userInfo mutableCopy];
if (!userInfo) userInfo = [NSMutableDictionary new];
userInfo[NSLocalizedDescriptionKey] = exception.reason;
*error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:userInfo];
}
// Note the missing return value outside the try-catch
}
함수를 호출 : 컴파일 및 디버그 방식으로 실행하는 경우
NSError *error;
BOOL result = [self catchException:^{
@throw [NSException exceptionWithName:@"Exception" reason:@"WTF?" userInfo:nil];
} error:&error];
NSLog(@"Result: %@", result ? @"YES" : @"NO");
을, 우리가 얻을 :
:2017-02-09 10:01:39.695 Compile Test[23129:630118] Result: NO
그리고 릴리스 방식과 같은 일을 할 때
2017-02-09 10:01:39.695 Compile Test[23129:630118] Result: YES
따라서 try-catch 블록 외부에 반환 값이 없으며 try-catch 내부의 반환 값에 도달하지 못하더라도 두 경우 모두 반환 값이 나타납니다. 우리 모두 여기 혼동스러워?!
Apple에 버그 리포트를 제출했습니다. 그 이상의 문제가 있습니다. –
버그 신고 해주셔서 감사합니다! – bbum