转载请标明出处:

http://blog.csdn.net/xmxkf/article/details/51351188

本文出自:【openXu的博客】

iOS程序启动流程

1. 完整启动流程

  • 点击程序图标
  • 执行main函数
  • 执行UIApplicationMain函数
  • 创建UIApplication对象、UIApplication的delegate对象
  • 开启事件循环监听系统
  • 程序加载完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法
    • 创建窗口对象

      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    • 创建控制器对象

      self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
    • 设置窗口的根控制器

      self.window.rootViewController = self.viewController;
    • 让窗口成为主窗口、并且可见

      [self.window makeKeyAndVisible];

2. UIApplicationMain方法

  在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点

  1. int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)
  • argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可;
  • principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。
  • delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议;

    此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性;UIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的 application:didFinishLaunchingWithOptions:),程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了。

3. UIApplication

  • UIApplication是应用程序的核心,每一个程序在运行期必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针。
  • UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务。
  • UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
  1. - (IBAction)click {
  2. UIApplication *app = [UIApplication sharedApplication];
  3. //影藏显示状态栏
  4. app.statusBarHidden = No;
  5. // 设置图标右上角的数字
  6. app.applicationIconBadgeNumber = 0;
  7. // 设置是否需要显示网络连接状态
  8. app.networkActivityIndicatorVisible = YES;
  9. // 打电话\发短信\发邮件\打开safari浏览器
  10. NSURL *url = [NSURL URLWithString:@"tel://10086"];
  11. NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
  12. [app openURL:url];
  13. }

4. AppDelegate代理(生命周期回调)

  UIApplicationMain方法根据第四个参数delegateClassName生成应用程序类的代理(该类必须遵守UIApplicationDelegate协议),然后设置给UIApplication。应用程序生命周期发生变化就会调用AppDelegate代理中的方法。

  1. @implementation MJAppDelegate
  2. #pragma mark 在应用程序启动完毕后调用(只会调用一次,第一次打开程序的时候才会调用)
  3. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}
  4. #pragma mark app进入前台的时候调用
  5. - (void)applicationWillEnterForeground:(UIApplication *)application{}
  6. #pragma mark app获得焦点的时候调用(已激活)
  7. - (void)applicationDidBecomeActive:(UIApplication *)application{}
  8. #pragma mark app失去焦点的时候调用(未激活)
  9. - (void)applicationWillResignActive:(UIApplication *)application{}
  10. #pragma mark app进入后台的时候调用
  11. - (void)applicationDidEnterBackground:(UIApplication *)application{}
  12. #pragma mark app被关闭的时候会调用(前提条件:app在后台运行的时候)
  13. - (void)applicationWillTerminate:(UIApplication *)application{}
  14. @end

5. UIWindow

  UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow,但可以手动创建多个UIWindow。

UIWindow的主要作用:

①、提供一个区域来显示视图

②、将事件分发给视图

③、与UIViewController协同工作,方便完成设备方向旋转的支持

添加UIView到UIWindow中两种常见方式:

①、addSubview:直接将UIView添加到UIWindow中,程序负责维护UIView的生命周期以及刷新,但并不会理会UIView对应的UIViewController

②、rootViewController:自动将UIViewController对应的UIView添加到UIWindow中,同时负责维护UIViewController和UIView的生命周期

常用方法

makeKeyWindow:让当前UIWindow变成keyWindow

makeKeyAndVisible:让当前UIWindow变成keyWindow,并显示出来

6. UIViewController控制器

  UIViewController属于MVC模型中的C(Controller),说的更具体点它是一个视图控制器,管理着一个视图(UIView)。

  一个UIViewController应该只管理一个view hierarchy,通常来说一个完整的view hierarchy指的是占满整一个屏幕。而很多app满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一个UIViewController和一套相应的view来完成所要的功能,这样做完全不符合Apple提供的设计规范。

UIViewController生命周期方法:

①、当view加载后调用viewDidLoad,这里可以进行一些数据的请求或加载,用来更新界面

②、当view将要被加入view hierarchy时调用viewWillAppear,完成加入时调用viewDidAppear

③、当view将要从view hierarchy中移除时调用viewWillDisappear,完成移除时调用viewDidDisappear

④、当内存紧张时, 调用didReceiveMemoryWarning,其默认实现是如果当前UIViewController的view的superview是nil,则将view释放且调用viewDidUnload, viewDidUnload中你可以进行后继的内存清理工作(主要是界面元素的释放,当再次加载的时候需要重建)

(这里的view是指UIViewController内部的view属性)

7. 控制器View的加载

  应用程序启动后,会调用代理的application:didFinishLaunchingWithOptions:方法,在这个方法中会完成控制器和View的加载。

  控制器MJViewController的view是延迟加载的,用到view时,就会调用控制器的loadView方法加载view,loadView加载view的默认过程(UIViewController的默认实现):

  1. 1> 如果nibName有值,就会加载对应的xib文件来创建view
  2. 2> 如果nibName没有值
  3. 1) 优先加载MJView.xib文件来创建view
  4. 2) 加载MJViewController.xib文件来创建view
  5. 3) 如果没有找到上面所述的xib文件,就会用代码创建一个黑色的view
  1. @implementation MJAppDelegate
  2. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  3. {
  4. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  5. // 创建控制器(控制器的view是延时加载:用到时再加载)
  6. self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
  7. // 如果执行下面设置view背景的方法,就会调用loadView加载view
  8. //self.viewController.view.backgroundColor = [UIColor blueColor];
  9. // 设置根控制器(没有用到根控制器的view)
  10. self.window.rootViewController = self.viewController;
  11. // 设置窗口可见(此时会加载view)
  12. [self.window makeKeyAndVisible];
  13. return YES;
  14. }
  1. @implementation MJViewController
  2. #pragma mark 如果不重写loadViewUIViewController默认实现
  3. - (void)loadView{
  4. // 不应该调用super的loadView
  5. // [super loadView];
  6. //NSLog(@"---loadView");
  7. // 死循环
  8. //self.view = [[UIScrollView alloc] initWithFrame:self.view.frame];
  9. // 返回最适合控制器view的frame
  10. CGRect frame = [UIScreen mainScreen].applicationFrame;
  11. //NSLog(@"%@", NSStringFromCGRect(frame));
  12. self.view = [[UIScrollView alloc] initWithFrame:frame];
  13. self.view.backgroundColor = [UIColor yellowColor];
  14. }*/
  15. #pragma mark view 加载完毕后调用
  16. - (void)viewDidLoad{
  17. [super viewDidLoad];
  18. // 初始化子控件
  19. }
  20. @end

iOS工程常见文件

1. xxx-Info.plist文件

  项目中最主要的文件,描述了软件名称、软件版本、唯一标识等,修改Summery相当于修改此文件。相当于Android的清单文件AndroidManifest.xml

  Bundle version -版本号(每次往App Store上发布一个新版本时,需要增加这个版本号)

  Bundle display name - 软件名称(限制在10-12个字符,如果超出,将被显示缩写名称)

  Localiztion native development region-本地化相关

  Icon file-app图标名称,一般为Icon.png

  Main nib file base name-主nib文件的名称

  Bundle identifier-项目的唯一标识,部署到真机时用到

  …

注意: 在Xcode3的时候文件名叫做:Info.plist,所以我们在创建.plist文件时不要取名为Info或者info.plist

2. InfoPlist.strings

  国际化相关配置

3. xxx-Prefix.pch

  一般来说,可以将项目中经常用到的一些头文件放在这里来import,整个项目都可以访问这个文件的内容,这样既节省了手动添加import的时间,也有助于加速编译。在这里定义的宏,整个项目都可以访问。

  示例:在pch文件中添加下列预处理指令,然后在项目中使用Log(…)来输出日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调试模式下,才有定义DEBUG)

  1. /*
  2. 如果软件处于调试状态,系统会默认定义一个叫做DEBUG的宏;
  3. 如果软件处于发布打包状态,系统就不会定义DEBUG这个宏
  4. */
  5. #ifdef DEBUG
  6. // 调试状态:将MJLog替换成NSLog
  7. #define MJLog(...) NSLog(__VA_ARGS__)
  8. #else
  9. // 发布状态:将MJLog替换成空
  10. #define MJLog(...)
  11. #endif

4. Default.png

  应用程序在启动过程中会全屏显示叫做Default.png的图片,不同屏幕分辨率会加载不同的图片,如果没找到会使用最接近的那张(系统自动识别)

Default.png 320x480

Default@2x.png 640x960

Default-568h@2x.png 640x1136

5. Icon.png

  应用程序图标

  苹果官方文档搜索”app icon” –>App Icons on iPad and iphone

  

iOS应用程序工程文件以及启动流程的更多相关文章

  1. iOS/iPhone 程序文件目录结构以及启动流程

    要想清晰的理解IOS应用程序的启动过程,毫无疑问需要深入了解一下ios应用程序的文件系统.一个ios应用程序都有一个属于自己沙盒(sandbox),应用沙盒就是文件系统目录,并且与文件系统的其他部分隔 ...

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

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

  3. ARM Cortex M0 程序映像和启动流程

  4. VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)

    VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)-软件开发-鸡啄米 http://www.jizhuomi.com/software/143.html   鸡啄米在上一讲中 ...

  5. linux-系统启动流程-7

    1,BIOS开机自检,检查cpu硬件及开机启动顺序,查找第一个磁盘磁头的MBR信息并加载BOOtloader,然后将控制权交与bootloader 2, GRUB GRUB(Grand Unified ...

  6. iOS 程序启动流程

    iOS程序启动原理   技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong   iOS应用程序运行 ...

  7. iOS app 程序启动原理

    iOS app 程序启动原理 Info.plist: 常见设置     建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...

  8. 发布iOS应用程序到苹果APP STORE完整流程

    参考:http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) http ...

  9. (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

随机推荐

  1. [NOI 2011]道路修建

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  2. [SCOI2009]生日快乐

    Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy ,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的 ...

  3. [JSOI2007]文本生成器

    题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机生成一些文章―――总是生成一篇长度 ...

  4. bzoj4361isn 容斥+bit优化dp

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 375  Solved: 186[Submit][Status][Discuss] ...

  5. [TensorFlow 团队] TensorFlow 数据集和估算器介绍

    发布人:TensorFlow 团队 原文链接:http://developers.googleblog.cn/2017/09/tensorflow.html TensorFlow 1.3 引入了两个重 ...

  6. Angular 和 Vue 使用的对比总结 -- 脚手架

    前言 之前是用Vue的,现在由于工作原因,开始使用Angular.分别是Vue2和Angular5入的坑.只是从使用上来对比总结,加深记忆,避免混淆. 什么 ?  你问实现原理的异同及优劣? 本宝宝还 ...

  7. junit4.9测试用例 spring测试用例 Assert 注解

    junit4.9测试用例 测试基类 import org.junit.runner.RunWith; import org.springframework.test.context.ContextCo ...

  8. 面向对象+canvas 倒计时

    效果参照网上的,用面向对象改写了一下,只写了自己需要的部分. 1.效果: 实现: //html <canvas id="canvas" width="800px&q ...

  9. 最小费用最大流(luogu P3381 【模板】最小费用最大流)

    题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...

  10. Linux搭建lamp(Apache+PHP+Mysql环境)centos7.2版详细教程

    我们更多的网站服务器是选择了Linux系统,这里建议你选择centos,这也是阿里云ecs推荐的系统,在服务器上比较推荐centos,特别对于新手,首选CentOS,并不是centos比Debian和 ...