zoukankan      html  css  js  c++  java
  • 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),那么上面说的程序流程就不使用,请记住。

  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/jhonyzhang/p/3667215.html
Copyright © 2011-2022 走看看