我有一个由以下内容组成的应用程序.m
file:
#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;
}
根据开发者文档 https://developer.apple.com/documentation/appkit/nsapplication/1428473-stop, stop
应该停止主循环(run
),但事实并非如此(至少在 OS X 10.12 和 10.13 上不是)。还有terminate https://developer.apple.com/documentation/appkit/nsapplication/1428417-terminate,但这太快退出程序了。我也尝试设置NSApplicationDelegate
实现applicationShouldTerminate
,但这从未被调用过。
如何确保主运行循环(干净地)退出?
Note:共享应用程序主循环是必要的,因为 UI 工作正在其他地方完成。更具体地说,这带来了问题Go WDE https://github.com/skelterjohn/go.wdeUI 库,它使用 Cocoa 为 Go 应用程序提供一个窗口。
The 的文档-stop: https://developer.apple.com/documentation/appkit/nsapplication/1428473-stop?language=objc says:
[C]从计时器或运行循环观察器例程中调用此方法不会停止运行循环,因为它们不会导致发布 NSEvent 对象。
分派到主队列的块的类似之处在于它不发布事件。您可以尝试发布一个NSEventTypeApplicationDefined
调用后的事件-stop:
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)