Objective-Cカテゴリでこの興味深いコードを見つけました。これはNSExceptionsを捕捉してNSErrorsとしてSwiftコードに渡すために使用されます。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