问题:如何让 Xcode 报告缺少的返回值?
下面是一个新的 Xcode 11 测试应用程序。我添加了带有空 @try/@catch block 且无返回值的 shouldReturnAnObject
方法。这样编译和分析时不会出现警告或错误。
#import "AppDelegate.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
- (nonnull id)shouldReturnAnObject {
@try {
} @catch (NSException *exception) {
} @finally {
}
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
id obj = [self shouldReturnAnObject];
NSLog(@"obj: %@", obj);
}
@end
如果我从中删除@try block ,则无法编译并出现错误:Control到达非void函数的末尾
。这是我期望任何没有返回值的方法的行为。
版本:Xcode 11.5、macOS 10.15.5。没有更改build设置。
添加 -Wall
不会改变行为。
我理解 Cocoa 的最佳实践是仅将异常用作异常。真正的应用程序很少使用异常,并且只是为了防止真正的异常行为。我提供了一个简单的测试应用程序来关注这个问题。
我相信这种行为在 Xcode/Clang 中已经存在很长时间了。如果该行为是故意的,有人可以解释为什么存在这种行为吗?whi
相关信息:我还在以下位置构建了快速测试应用程序:
- C++ (Clang++):编译失败并出现错误
-Wreturn-type
- Java ():编译失败,并显示
错误:缺少返回语句
- Objective-C++(使用 .mm 文件):没有警告,没有错误,编译成功
最佳答案
这是一个错误。在 https://llvm.org/PR46693 处提交了一个 LLVM 错误。
关于objective-c - 如果包含 @try @catch block ,则不带 return 语句的 Obj-C 方法可以编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62725644/