问题描述
我是可可的新手.
现在,从main()调用[NsApp run]
之后,我的简单Hello World应用程序即会阻塞.
Right now my simple Hello World app blocks after calling [NsApp run]
from main().
我所需要做的就是创建一个窗口,而不是阻塞main().
All I need is create a window and not block main().
我希望我的应用程序的行为类似于glfw:
I want my application to behave like glfw:
https://github.com/glfw/glfw/blob/master/src/cocoa_window.m#L1022
由于某种原因,它不会在那里阻塞.实际上,您可以删除此行,它仍然可以使用.
For some reason, it doesn't block there. In fact, you can remove this line, and it will still work.
我一直在和glfw的源代码打交道,以弄清它们的不同之处.例如,如果我删除[NSApp setDelegate:_glfw.ns.delegate];
I've been playing with a glfw source to figure out what they do differently. And for example, [NsApp run]
blocks if I remove [NSApp setDelegate:_glfw.ns.delegate];
但这不是.
根据 Apple文档:
通常,应用程序会在事件循环发生时创建对象 运行或通过从nib文件加载对象,因此缺少访问权限 通常不是问题.但是,如果您确实需要使用Cocoa类 在main()函数本身中(除了加载nib文件或 实例化NSApplication),则应创建一个@autorelease块以 使用这些类来包含代码.
Typically, an app creates objects either while the event loop is running or by loading objects from nib files, so this lack of access usually isn’t a problem. However, if you do need to use Cocoa classes within the main() function itself (other than to load nib files or to instantiate NSApplication), you should create an @autorelease block to contain the code using the classes.
我想这就是我所需要的,但是我不知道如何使用@autorelease块.
I guess that's what I need, but I have no idea how to use the @autorelease block.
感谢您的帮助.
推荐答案
我知道了.
GLFW实现了自己的事件循环,因此不需要调用[NSApp run]:
GLFW implements its own event loop, so calling [NSApp run] is not needed:
NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
untilDate:[NSDate distantFuture]
inMode:NSDefaultRunLoopMode
dequeue:YES];
[NSApp sendEvent:event];
这篇关于如何使[NsApp运行]不被阻止?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!