7

我很好奇, int main 函数在 Cocoa 程序中起什么作用?实际上,我一直在查看的所有示例代码在 main.m 中都只有以下代码:

#import <Cocoa/Cocoa.h>


int main(int argc, char *argv[])
{

    return NSApplicationMain(argc,  (const char **) argv);
}

这到底是做什么的,程序实际上是从哪里开始逐步执​​行命令的?看来我的观念需要重新调整。

4

5 回答 5

12

由于 Cocoa 项目与其他项目一样开始,因此操作系统的入口点是 main。然而,Cocoa 体系结构实际上是从 NSApplicationMain 开始处理程序的,它负责从应用程序加载初始窗口并启动用于处理 GUI 事件的事件循环。

Apple 在 Cocoa Fundamentals Guide 中对此进行了非常深入的讨论:Mac OS X 上的核心应用程序架构

于 2010-01-21T17:07:21.940 回答
5

如果您想了解控制如何从“启动这个”传递到main()函数,execve手册页有详细信息。您还想了解dyldmain()是 Unix 标准的一部分。您可以有效运行的每个程序都有一个main().

正如其他人所提到的,NSApplicationMain将控制权交给了 Cocoa。该文档非常具体地说明了它的作用。

一个有趣的注意事项,NSApplicationMain实际上并非每次都返回。也就是说,如果您将函数NSApplicationMain中的调用与返回分开main并将代码放在两者之间,则该代码将永远不会被执行。

于 2010-01-21T17:39:47.653 回答
4

main() 是程序的入口点。

当您运行程序时,这是调用的第一个函数。当您退出该功能时,您的程序结束。

另请注意,这不是来自 Objective-C。这很简单 C.

看看 维基百科的页面就可以了

于 2010-01-21T17:04:40.883 回答
0

当进程完成时,从 main 返回的值由进程返回给操作系统。

Shell 存储最后一个进程返回的值,您可以使用以下命令将其取回$?

> ls
a b c

> echo $?
0

> ls x
x: No such file or directory

> echo $?
1

ls 是一个像其他任何东西一样的应用程序。

您可以使用返回值将多个进程链接在一起,使用 shell 脚本或其他任何可以执行进程并检查返回值的东西。

于 2010-01-21T22:06:54.297 回答
0

我想知道代码从哪里开始执行(比如为什么 NSView 子类在没有我显式调用它的情况下执行和绘制?),如果我不应该将我的主循环粘贴在 int main() 中它会去哪里?

在 xcode 项目中,您有一个包含“int main”函数的 main.m 文件。您实际上不会找到显式调用 NSView 绘制的代码,该代码隐藏在 iPhone 或 Mac OS X 框架的深处。只要知道在您的“int main”深处隐藏着一个事件循环,它会检查更改,以便知道何时更新您的视图。您不需要知道这个事件循环在哪里,它不是有用的信息,因为您可以覆盖方法或创建和分配可以在发生这种情况时执行操作的委托。

为了获得更好的答案,您需要解释您想要放入“int main”函数中的“主循环”是什么意思。

对 C++ 有一点经验对我来说很奇怪。主函数如此空虚,这看起来很不自然。

您可以将十亿行代码封装到一个函数中,然后将其放入“int main”中。不要被只有几行的主要内容所欺骗,这是故意的。好的编程教会我们将代码保存在特定的容器中,以便组织良好。Apple 选择在 main.m 文件中的这一行代码中创建其 iPhone 应用程序的“真正”启动点:

int retVal = UIApplicationMain(argc, argv, nil, @"SillyAppDelegate");

从那段代码中,启动了应用程序的委托,并且在完成之前不会将控制权返回给主函数。

于 2010-01-21T22:24:28.813 回答