我很好奇, int main 函数在 Cocoa 程序中起什么作用?实际上,我一直在查看的所有示例代码在 main.m 中都只有以下代码:
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
这到底是做什么的,程序实际上是从哪里开始逐步执行命令的?看来我的观念需要重新调整。
我很好奇, int main 函数在 Cocoa 程序中起什么作用?实际上,我一直在查看的所有示例代码在 main.m 中都只有以下代码:
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
这到底是做什么的,程序实际上是从哪里开始逐步执行命令的?看来我的观念需要重新调整。
由于 Cocoa 项目与其他项目一样开始,因此操作系统的入口点是 main。然而,Cocoa 体系结构实际上是从 NSApplicationMain 开始处理程序的,它负责从应用程序加载初始窗口并启动用于处理 GUI 事件的事件循环。
Apple 在 Cocoa Fundamentals Guide 中对此进行了非常深入的讨论:Mac OS X 上的核心应用程序架构
当进程完成时,从 main 返回的值由进程返回给操作系统。
Shell 存储最后一个进程返回的值,您可以使用以下命令将其取回$?
:
> ls
a b c
> echo $?
0
> ls x
x: No such file or directory
> echo $?
1
ls 是一个像其他任何东西一样的应用程序。
您可以使用返回值将多个进程链接在一起,使用 shell 脚本或其他任何可以执行进程并检查返回值的东西。
我想知道代码从哪里开始执行(比如为什么 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");
从那段代码中,启动了应用程序的委托,并且在完成之前不会将控制权返回给主函数。