【发布时间】:2017-12-29 09:20:32
【问题描述】:
我是一个完整的 Cocoa 新手。
现在我的简单 Hello World 应用程序在从 main() 调用 [NsApp run] 后阻塞。
我只需要创建一个窗口而不是阻塞 main()。
我希望我的应用程序表现得像 glfw:
https://github.com/glfw/glfw/blob/master/src/cocoa_window.m#L1022
由于某种原因,它不会在那里阻塞。实际上,您可以删除此行,它仍然可以工作。
我一直在使用 glfw 源来弄清楚它们的不同之处。例如,如果我删除 [NSApp setDelegate:_glfw.ns.delegate];,[NsApp run] 会阻塞
但事实并非如此。
根据Apple docs:
NSApplication 类在 初始化和事件循环内部——特别是在它的 初始化(或共享)和 run() 方法。
通常,应用程序会在事件循环执行时创建对象 运行或通过从 nib 文件加载对象,因此缺乏访问权限 通常不是问题。但是,如果您确实需要使用 Cocoa 类 在 main() 函数本身内(除了加载 nib 文件或 实例化 NSApplication),你应该创建一个 @autorelease 块来 包含使用类的代码。
我想这就是我需要的,但我不知道如何使用 @autorelease 块。
感谢您的帮助。
【问题讨论】:
-
而且你甚至不会告诉你为什么要调用 [NsApp run] 以及在哪里调用?
-
根据Apple docs,应用程序会一直运行,直到您告诉它退出为止。
-
@ElTomato 我已经更新了这个问题。我只需要创建一个窗口而不是阻塞 main()。
-
@Willeke 它不会在 glfw 中阻塞。我想知道他们是怎么做到的。
-
探索链接代码,看看
GLFWApplicationDelegate做了什么。
标签: objective-c macos cocoa