如何让[NsApp run]不被阻塞?

Ale*_*lex 1 macos cocoa objective-c

我是一个完整的可可新手。

现在,我的简单 Hello World 应用程序在[NsApp run]从 main()调用后阻塞。

我所需要的只是创建一个窗口而不是阻塞 main()。

我希望我的应用程序表现得像 glfw:

https://github.com/glfw/glfw/blob/master/src/cocoa_window.m#L1022

出于某种原因,它不会在那里阻塞。实际上,您可以删除此行,它仍然可以工作。

我一直在玩 glfw 源来弄清楚它们的不同之处。例如,[NsApp run]如果我删除,则会阻止[NSApp setDelegate:_glfw.ns.delegate];

但不是这样。

根据苹果文档

NSApplication 类在初始化期间和事件循环内部——特别是在其初始化(或共享)和 run() 方法中设置 @autorelease 块。

通常,应用程序在事件循环运行时或通过从 ni​​b 文件加载对象来创建对象,因此缺乏访问权限通常不是问题。但是,如果您确实需要在 main() 函数本身中使用 Cocoa 类(除了加载 nib 文件或实例化 NSApplication),您应该创建一个 @autorelease 块来包含使用这些类的代码。

我想这就是我需要的,但我不知道如何使用 @autorelease 块。

谢谢你的帮助。

Ale*_*lex 5

我想到了。

GLFW 实现了自己的事件循环,因此不需要调用 [NSApp run]:

NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
                                        untilDate:[NSDate distantFuture]
                                           inMode:NSDefaultRunLoopMode
                                          dequeue:YES];
    [NSApp sendEvent:event];
Run Code Online (Sandbox Code Playgroud)