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

问题描述 投票:0回答:1

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

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

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

我希望我的应用程序行为像glfw:

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

出于某种原因,它不会阻止那里。实际上,你可以删除这一行,它仍然可以工作。

我一直在玩glfw源代码来弄清楚他们做了什么不同的事情。例如,如果我删除[NsApp run][NSApp setDelegate:_glfw.ns.delegate];阻止

但那不是它。

根据Apple docs

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

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

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

谢谢你的帮助。

objective-c macos cocoa
1个回答
1
投票

我想到了。

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

NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
                                        untilDate:[NSDate distantFuture]
                                           inMode:NSDefaultRunLoopMode
                                          dequeue:YES];
    [NSApp sendEvent:event];
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.