如何使[NsApp运行]不阻止?

时间:2017-12-29 09:20:32

标签: objective-c macos cocoa

我是一个完整的Cocoa新手。

现在我的简单Hello World应用程序在从main()调用io.Reader后阻止。

我只需创建一个窗口而不是阻止main()。

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

Apple docs

出于某种原因,它并没有阻止那里。实际上,您可以删除此行,它仍然有效。

我一直在玩glfw来源,弄清楚他们的做法有多么不同。例如,如果我删除[NsApp run]

,则会[NsApp run]阻止

但那不是。

根据{{3}}:

  

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

     

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我明白了。

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

NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
                                        untilDate:[NSDate distantFuture]
                                           inMode:NSDefaultRunLoopMode
                                          dequeue:YES];
    [NSApp sendEvent:event];

答案 1 :(得分:0)

我刚刚遇到了同样的情况。 我发现了一些不同的解决方案。

只需调用[[NSApplication sharedApplication] run];,并在创建窗口后调用[[NSApplication sharedApplication] stop:nil];run调用将立即退出。然后您仍然可以调用sendEvent方法。