【发布时间】:2017-12-31 09:08:06
【问题描述】:
我有一个包含以下单个 .m 文件的应用程序:
#import <Cocoa/Cocoa.h>
int main(int argc, char* argv[]) {
[[[NSThread alloc] initWithBlock: ^{
sleep(2);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Stop");
[[NSApplication sharedApplication] stop:nil];
});
}] start];
[[NSApplication sharedApplication] run];
NSLog(@"Run finished");
return 0;
}
根据the developer documentation,stop 应该停止主循环 (run),但它不会(至少在 OS X 10.12 和 10.13 上不会)。还有terminate,但是这个退出程序太快了。我还尝试设置一个实现applicationShouldTerminate 的NSApplicationDelegate,但这从未被调用过。
如何确保主运行循环(干净)退出?
注意: 共享应用程序主循环是必要的,因为 UI 工作正在其他地方完成。更具体地说,这给Go WDE UI 库带来了问题,它使用 Cocoa 为 Go 应用程序提供一个窗口。
【问题讨论】:
-
没有足够的上下文来回答这个问题。即兴发挥,如果你正在编写一个命令行工具,它应该被构造成一个命令行工具,并且根本不使用 NSApplication。
-
@bbum 我没有添加任何上下文,因为它似乎与问题无关,只会使问题复杂化。无论如何,添加了请求的上下文。
标签: objective-c cocoa nsapplication