ios 应用剖析

时间:2022-11-12 23:01:18

在创建HelloWorld的过程中,生成了很多文件(展开Xcode左边的项目导航视图可以看到,如图2-8所示),它们各自的作用是什么?彼此间又是怎样的一种关系呢?

ios 应用剖析

图2-8 项目导航视图

如图2-8所示,导航视图下有HelloWorld、Frameworks和Products三个组。

在HelloWorld组*有两个类:AppDelegateViewController,以及一个组Supporting Files。 我们主要的编码工作就是在AppDelegateViewController这两个类中进行的,它们的类图如图2-9所示。

ios 应用剖析[+]查看原图

图2-9 HelloWorld工程中的类图

AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理相应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期。相应地,AppDelegate的子类也可以实现这两个功能。

ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演着根视图和用户事件控制类的角色。需要特别指出的是,ViewController.xib文件也是视图控制文件,起描述作用,与ViewController配套存在。

AppDelegateViewController类与main代码模块的主函数存在一种直接的调用关系,下面我们借助UML时序图来进行详细说明,如图2-10所示。

ios 应用剖析

图2-10 HelloWorld启动时序图

可以看到,在HelloWorld启动过程中,首先调用main.m代码模块的main()主函数进行AppDelegate的实例化,具体代码如下所示:

int main(int argc,char*argv[]){@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));}}

AppDelegate类是应用程序委托对象,这个类中继承的一系列方法在应用生命周期的不同阶段会被回调。启动HelloWorld时,首先会调用application:didFinishLaunchingWithOptions:方法,该方法的代码如下:

-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{self.window =[[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];self.viewController =[[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];self.window.rootViewController =self.viewController;[self.window makeKeyAndVisible];return YES;}

在该方法中,共做了3件事:实例化UIWindow,实例化ViewController,然后把ViewController作为根视图控制器放到UIWindow上。每一个iOS应用都有一个UIWindow对象,而每一个UIWindow对象上面都一个根视图,它所对应的控制器为根视图控制器(ViewController)。UIWindow对象与根视图UIView之间的关系如图2-11所示。在根视图上,我们可以添加子视图。各种控件(包括UIWindow)都继承了UIView

ios 应用剖析

图2-11 UIWindow对象与根视图

Supporting Files组共有4个文件。为了便于大家理解,经过分析和提炼,我们将各文件的作用以表的形式向大家总结说明,见表2-1。

表2-1 Supporting Files组文件说明表

文件名 说明
HelloWorld-Info.plist 工程属性描述文件,它的命名必须是“工程名+Info.plist”
InfoPlist.strings 工程本地化的字符串文件
main.m 应用程序的入口程序文件,它不是一个类,其中只有一个main()主函数,应用的运行都是由此开始
HelloWorld-Prefix.pch 在这个文件中可以引入一些头文件,这样工程中的其他文件就不需要再引入了。它的命名必须是“工程名+ Prefix.pch”

Frameworks组包含工程里引用到的框架或类库,而Products组是工程将要生成的产品包。