IOS程序的起动流程

来源:http://www.myexception.cn/operating-system/582155.html

IOS程序的启动流程
         要想清晰的理解IOS应用程序的启动过程,毫无疑问需要深入了解一下ios应用程序的文件系统。一个ios应用程序都有一个属于自己沙盒 (sandbox),应用沙盒就是文件系统目录,并且与文件系统的其他部分隔离。应用必须待在自己的沙盒里,应用既不能访问其他应用的沙盒,其他应用也不 能访问该沙盒。

 

         应用沙盒包含多个目录:

         1.应用程序包(application bundle):包含所有的资源文件和可执行文件,并且是只能文件目录;

         2.偏好设置文件(Library/Preferences/):存放所有的偏好设置。通过NSUserDefaults类可以读取写入该文件,同时可以作为应用的默认启动设置,即应用的setting会在该目录中查找应用的设置信息。

         3.临时文件(tmp/):用于保存程序运行时所需的临时数据,使用完毕后的临时数据对应的文件将从该目录下删除。同时,应用结束时也可能会清除该目录 下的文件。在程序运行时可以通过方法NSTemporaryDirectory可以的得到该沙盒下tmp目录的全路径。

         4.应用运行时保留的数据(Documents/):保存应用运行时生成的需要保留的数据。该文件对于在设备发生故障时,通过ituns同步设备备份该目录,从而可以恢复应用的数据。

         5.保存应用运行时生成的需要保留的数据(Library/Caches):与4的不同之处时ituns同步不能备份该目录。因为该缓存数据的体积比较 大,会延长同步设备所需的时间。但是如果数据源在别处(例如,网络的服务器),那么可以通过将数据保存在该目录。当用户需要恢复设备,可以从服务器下载这 些数据。

          可以总结一下,Library/Preferences/、Documents/ 下的文件时可以通过iTuns同步设备时进行备份目录,而tmp/、Documents/是不能备份的。

         上面介绍了沙盒的文件系统结构,下面继续讲应用程序包中文件,这里面的资源文件以及可执行文件是程序工程开发时产生的。它    基本上包含了:         

 

         1. .pch:预编译头文件,win32里经常会碰到,这里也有,包含了常用的头文件。

 

 

         2. .plist:包含了项目自身的特性,比如说项目名称,默认加载的nib file,版本等。          3..xib:程序的资源文件。用于简化编码过程,提高开发效率。          4. main.m:iOS应用程序的入口,类似于C/C++中的main函数。                     到了这里,基本就可以开始应用程序具体的启动过程了。          在main.m文件中,
int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

main函数仍然是程序的入口函数,其中argc、argv为运行程序的支持命令行的参数输 入,而后面的两个参数最后再讲。之后可以看到重要的黑体程序行——UIApplicationMain 的调用,通过它完成系统启动的过程,并形成一个事件驱动。那么是如何完成系统的启动过程呢?可以参照Apple提供的启动流程图:



可以看到UIApplication首先会去查看info.plist中记录的一些应用的基本信息(如下图),其中最重要的是应用程序启动资源文件的名称(nib文件,名称用Main nib File base name键指定),如何创建的是universe的应用,那么还会包含ipad的启动资源文件的名称。从下图中我们还看到了应用图标文件以及支持方向感应器的方向。


从工程文件中找到Main nib file对应的MainWindow_iPhone.xib文件,可以看到有四个基本的项目:

1.File’s Owner 对象:实际上就是 UIApplication 的实例。

2.First Responder 对象:每个程序都会有一个第一响应者,比如鼠标事件,键盘事件等,它就是对应的那个对象。比如多文档程序中,menu的响应事件一般都是连接到 FirstResponder中去的,因为主界面一般都在别的nib里面,此时的FirstResponder就是你的那个主nib的 FileOwner。

3.Delegate 对象:每个程序都有一个工程名+AppDelegate类,即为该Delegate的实现。

4.Window:应用程序启动的时候所显示的窗口。

程序启动时,那么就会发送消息给UIApplication的Delegate对象,就会调用AppDelegate类的applicationDidFinishLaunching: 方法。因此可以在MainWindow_iPhone.xib指定某个特定的Delegate对象,从而启动的位置会发生改变。

而在Delegate类中的applicationDidFinishLaunching:会初始化window对象,即程序启动时候的显示窗口。

具体的代码为:

 

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Override point for customization after app launch
    [window addSubview:UIViewControllerInstance.view];
    [window makeKeyAndVisible];
}
[window addSubview:UIViewControllerInstance.view] 表示 在调用[window makeKeyAndVisible] 是显示UIViewControllerInstance的View

 

综上所述,程序启动的流程为:


讲到这里,如果没有版本的更新问题,其实是可以结束了。而在XCode4.2版本之后,可能没有了Main.xib来载入初始界面。那么就不得不使用UIApplicationMain指定入口。前面讲到了UIApplicationMain含有四个参数,这里可以将UIApplicationMain(argc, argv, nil, nil);变成UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));。这里的AppDelegate为你要完成初始化界面的delegate。

除了上面的改变,版本更新还添加了故事板(storyBoard),那么上面说的程序流程就不使用,请记住。

原文地址:https://www.cnblogs.com/jhonyzhang/p/3667215.html