它是如何启动GUI应用程序的?

时间:2012-08-04 05:57:32

标签: objective-c xcode cocoa

假设我刚刚创建了一个Cocoa应用程序。我有三个文件:AppDelegate.h,AppDelegate.m和MainMenu.xib。

如果我没有触摸任何东西并运行应用程序,编译器是否实际编译了AppDelegate.h和AppDelegate.m,即使我还没有写任何东西?

编译器如何知道要包含哪些文件?

1 个答案:

答案 0 :(得分:3)

你的问题非常笼统,但我会勾勒出一些高级细节。在Xcode中创建新项目时,您可以选择一个基于它的项目模板。在你的情况下,听起来你使用简单的Cocoa应用程序模板。这将为您提供AppDelegate.h,AppDelegate.h和MainMenu.xib以及Project导航器中“Supporting Files”文件夹下列出的一些其他文件。我们稍后会介绍其中一些。首先请注意,在新项目目录的顶层,看起来像一个名为MyProject.xcodeproj的文件。这实际上是打包在一起的目录,看起来像一个文件,里面是一个名为project.pbxproj的文件。此文件是一个XML文件,其中包含构建的所有设置。它由项目模板预先配置,以构建一个简单的应用程序。默认project.pbxproj中指定的基本构建过程是:

  • 编译AppDelegate.m和main.m
  • 将目标代码与依赖框架链接
  • 将可执行文件与项目中包含的其他资源(如MainMenu.xib)一起放入称为应用程序包的特殊目录结构中
  • 然后,Finder可以启动新组装的应用程序包。

如果你看看main.m,你会发现它看起来很像旧式main.c,除了它运行NSApplicationMain()。此函数最终创建项目的Info.plist中列出的“Principal类”的实例。默认情况下,这是NSApplication,这是Cocoa提供的标准类。然后加载“主nib文件基本名称”,即项目的MainMenu.xib。一个nib文件基本上只是一堆“冻干对象”,它们被实例化并在它们之间建立连接。 MainMenu.xib文件中的一个对象是AppDelegate的实例,这是此代码加载到内存中的方式。在默认模板中,AppDelegate不执行任何操作,MainMenu.xib仅包含标准应用程序菜单栏和空白窗口。这是您在运行应用程序时将看到的内容。

在编写一行代码之前,您可以免费获得所有这些作为起点。此时,Cocoa编码器通常会开始填写AppDelegate,编写新类,或为UI的其他部分添加新的nib文件。