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

应用沙盒包含多个目录:

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

注意:每个应用程序可以有多个程序包,但是只能有一个主程序包,即包含应用程序代码的程序包。当用户启动应用程序的时候,应用程序会在主程序包中寻找即刻要用到的代码和资源,并将其加载到内存。然后它可以根据需要动态(并延时)加载主程序包或者丛属程序包中的代码和资源。应用程序可以用NSBundle 和Core Foundation 的CFBundleRef(在过程化的语言中使用)定位程序包中的资源。在Objective-C中,首先要获得一个NSBundle实例,它和某个物理程序包对应。如需获得应用程序主程序包,则应调用mainBundle类方法。然后调用NSBundle的其他方法,传入文件名、扩展名以及(可选)程序包子目录,这些方法将会返回程序包资源的路径。有了资源路径,您就可以使用恰当的类将其加载到内存。代码案例有:

[cpp] view plaincopy

 
  1. NSString *str=[[NSBundle mainBundle]pathForResource:@"example" ofType:@"png"];

即可返回应用程序包中保含的example.png文件的路径。你可以使用str来对example.png进行操作。

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

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

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

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

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

目录

描述

<Application_Home>/AppName.app

这是程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

在iPhone OS 2.1及更高版本的系统,iTunes不对这个目录的内容进行备份。但是,iTunes会对在App Store上购买的应用程序进行一次初始的同步。

<Application_Home>/Documents/

您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。有关如何取得这个目录路径的信息,请参见“获取应用程序目录的路径”部分。

iTunes会备份这个目录的内容。

<Application_Home>/Library/Preferences

这个目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类或CFPreferences API来取得和设置应用程序的偏好,详情请参见“添加Settings程序包”部分。

iTunes会备份这个目录的内容。

<Application_Home>/Library/Caches

这个目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。您的应用程序通常需要负责添加和删除这些文件,但在对设备进行完全恢复的过程中,iTunes会删除这些文件,因此,您应该能够在必要时重新创建。您可以使用“获取应用程序目录的路径” 部分描述的接口来获取该目录的路径,并对其进行访问。

在iPhone OS 2.2及更高版本,iTunes不对这个目录的内容进行备份。

<Application_Home>/tmp/

这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。当您的应用程序不再需要这些临时文件时,应该将其从这个目录中删除(系统也可能在应用程序不运行的时候清理留在这个目录下的文件)。有关如何获得这个目录路径的信息,请参见“获取应用程序目录的路径”部分。

在iPhone OS 2.1及更高版本,iTunes不对这个目录的内容进行备份。

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

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

2. .plist:包含了项目自身的特性,比如说项目名称,默认加载的nib file,版本等。         3..xib:程序的资源文件。用于简化编码过程,提高开发效率。         4. main.m:iOS应用程序的入口,类似于C/C++中的main函数。                   到了这里,基本就可以开始应用程序具体的启动过程了。         在main.m文件中,

[cpp] view plaincopy

 
  1. <span style="font-size:14px;">int main(int argc, char *argv[]) {
  2. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  3. <strong>int retVal = UIApplicationMain(argc, argv, nil, nil);</strong>
  4. [pool release];
  5. return retVal;
  6. }
  7. </span>

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对象,即程序启动时候的显示窗口。

具体的代码为:

[cpp] view
plain
copy

 
  1. <span style="font-size:14px;">- (void)applicationDidFinishLaunching:(UIApplication *)application {
  2. // Override point for customization after app launch
  3. [window addSubview:UIViewControllerInstance.view];
  4. [window makeKeyAndVisible];
  5. }
  6. </span>

[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),那么上面说的程序流程就不使用,请记住。


PS:对于iPhone app,你无法访问iPhone整个的文件系统,而只能访问iPhone app的Home目录中的文件。在程序中可以用下面的方式来访问文件目录:

方法1:

[cpp] view
plain
copy

 
  1. NSString* documentsDirectory = [NSHomeDirectory()
  2. stringByAppendingPathComponent:@"Documents"];

方法2:

[cpp] view
plain
copy

 
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
  2. NSString *documentsDirectory = [paths objectAtIndex:0];

采用上面的方法你可以访问Home目录下的其他文件。同时iOS还提供了一些常用的搜索路径常量:

常量

目录

NSDocumentDirectory

<Application_Home>/Documents

NSCachesDirectory

<Application_Home>/Library/Caches

NSApplicationSupportDirectory

<Application_Home>/Library/Application Support


更多
0

iOS/iPhone 程序文件目录结构以及启动流程的更多相关文章

  1. iOS应用程序工程文件以及启动流程

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51351188 本文出自:[openXu的博客] iOS程序启动流程 完整启动流程 UIApp ...

  2. 【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS的程序的结构] 开始熟悉Xamarin在开发IOS的结构!!!!!!! 先看官方 这个是以一个单页面的程序进行讲述的. 1 程序引用的程序集,核 ...

  3. iOS项目管理:目录结构和开发流程

    iOS项目管理:目录结构和开发流程     最近正在做一个大版本的更新,现在在重构中.... 发现很多人在一个项目的开始不知道开发流程是什么,也不是非常清晰的知道一个项目该有目录结构.如果项目小或者是 ...

  4. iOS项目的目录结构和开发流程

    转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法.   目录结构 AppDelegate Models Ma ...

  5. Phalcon的Mvc结构及启动流程(部分源码分析)

    Phalcon本身有支持创建多种形式的Web应用项目以应对不同场景,包括迷你应用.单模块标准应用.以及较复杂的多模块应用 创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalc ...

  6. iOS 应用程序目录结构

    iOS应用程序采用的是沙盒原理设计,普及一下知识:沙盒是在受限的安全环境中运行应用程序的一种做法,这种做法是要限制授予应用程序的代码访问权限. 具体的特点有三点:1.每个应用程序都有自己的存储空间:  ...

  7. Phalcon Framework的MVC结构及启动流程分析

    目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ...

  8. Phalcon Framework的Mvc结构及启动流程(部分源码分析)

    创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalcon多模块应用 phalcon project eva --type modules入口文件为public/index.p ...

  9. 《Cortex-M0权威指南》之体系结构---程序映像和启动流程

    转载请注明来源:cuixiaolei的技术博客 我们先来看看程序映像. 通常,Cortex-M0处理器的程序映像时从地址0x00000000处开始的. 程序映像开始处时向量表,其中包含了异常的其实地址 ...

随机推荐

  1. Flashback version/Transaction Query,FlashbackTable

    Flashback version Query相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个 ...

  2. FlexSlider是一个非常出色的jQuery滑动切换插件

    FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.适合所有初级和高级网页设计师使用.不过很多人都只是使用默认的参数,今天来说说具体的参数来给大家看看 ...

  3. 代码先行-log4Net初体验

    1.安装 从http://logging.apache.org/log4net/download_log4net.cgi下载编译好的log4Net包并解压. 找到 bin\net\4.0\releas ...

  4. QQ浏览器不支持JS问题

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. SQL Server -SET NOCOUNT

    SET NOCOUNT 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息. 语法 SET NOCOUNT { ON | OFF } 注释 当 SET NOCOUNT 为 ON ...

  6. PHP学习笔记二十六【类的重载】

    <?php //重载: //函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名 Class A{ // public function test1(){ // echo &q ...

  7. Python学习笔记2(控制语句)

    1.if条件语句 if(表达式): 语句1 else: 语句2 2.if...elif...else判断语句 if(表达式1):语句1 elif(表达式2):语句2 ... elif(表达式n):语句 ...

  8. java程序的10个调试技巧

    参看下面链接:http://www.kuqin.com/java/20120906/330130.html

  9. [ofbiz]解决load-demo花费过长时间的问题

    一直以来使用公司配置的hp-cq45笔记本,在初始化ofbiz的时候load-demo需要花费很长一段时间,比如90分钟,或者129分钟. 解决办法:安装官方驱动--intel快速存储驱动 ok,lo ...

  10. oracle 时间比较查询

    select * from table  where add_time>=to_date('2015/01/03','yyyy/mm/dd')