我是一个完整的可可新手。
现在,我从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块。
谢谢你的帮助。
我想到了。
GLFW实现自己的事件循环,因此不需要调用[NSApp run]:
NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
untilDate:[NSDate distantFuture]
inMode:NSDefaultRunLoopMode
dequeue:YES];
[NSApp sendEvent:event];