在Apple的Cocoa API中,为什么从主线程调用NSApplicationMain很重要?

Cal*_*vin 7 cocoa multithreading program-entry-point nsapplication

NSApplicationMain的文档中,它说:

创建应用程序,从应用程序的主bundle加载主nib文件,然后运行应用程序.您必须从应用程序的主线程调用此函数[...].

"主线程"显然是指程序的第一个线程,其中main(argc, argv)start.通过NSThread文档快速浏览一下+ (BOOL)isMainThread,可以用来确定当前线程是否是"主要"线程.我运行了一些测试:无论是否NSApplicationMain已调用此方法,此方法都有效.

我的问题有两个(有些相关)部分:

  1. 主线程有NSApplicationMain什么特别之处?
  2. Cocoa如何识别主线程?

mat*_*ias 7

通过重新实现该函数,这里是学习NSApplicationMain的好地方.必须从主线程调用NSApplicationMain主要是因为

  1. 它处理主要接口
  2. UI元素(在几个系统中,而不仅仅是OS X)需要在同一个线程中调用才能正常运行.
  3. Cocoa框架中提供的图形元素假设它们将在主线程中运行.

因此,由于Cocoa调用主线程中的内容,并且UI需要在同一个线程中运行,因此您需要在主线程中处理任何涉及UI的内容,包括NSApplicationMain.

  • 主线程由pthreads实现维护.在OS X上,它提供了`pthread_main_np()`函数.在各种高级框架中,查询pthreads以使主线程的`CFRunLoopGetMain()`等于`CFRunLoopGetCurrent()`.要求主运行循环的第一个线程导致它被创建并存储在共享变量中,但只有主线程从`CFRunLoopGetCurrent()`返回该运行循环.等等.因此,尝试在另一个线程上运行`NSApplicationMain()`将无法正常工作,因为该线程将不会运行主运行循环. (3认同)