程序启动开始到view显示:

程序启动首先会执行main函数 - > UIApplicationMain函数:

  1. 程序启动 (加载框架,info文件,资源等)
  2. 执行Main函数
  3. 初始化UIApplication单例对象
  4. 初始化AppDelegate对象,并设为UIApplication对象的代理
  5. 然后调用UIApplication的didFinishLaunchingWithOptions方法创建UIWindow对象,设置rootViewController根控制器等
  6. 然后建立一个主事件循环,其中包含UIApplication的Runloop来开始处理事件。

执行main函数

main函数作为程序的主入口,程序启动就自动执行main函数(main函数是一个死循环,保证了程序不会自动关闭)

 /**
* 1.1程序执行首先执行main函数
*/
int main(int argc, char argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

初始化UIApplication单例对象

初始化AppDelegate对象,并设为UIApplication对象的代理

创建UIApplication单例对象,并且设置UIApplication的Delegate对象(进入main函数后,首先就执行UIApplicationMain函数)

所以启动程序就会创建application单例对象,并且设置了AppDelegate为application对象的代理

看看内部的定义:

//  argc、argv:直接传递给UIApplicationMain进行相关处理即可
// principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
// delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议 int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString delegateClassName);

调用UIApplication的didFinishLaunchingWithOptions方法创建UIWindow单例对象

程序启动完成后 , 接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)
 
Runloop的理解,可参考文章 : 转载自【楚天舒iOS程序与运行Runloop】
 
application的代理方法浅析
 
 // 当应用程序启动完毕的时候就会调用(系统自动调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//创建UIWindow,设置rootViewControlle等的操作都是在这里完成 // 1 . 创建UIwindow对象
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 2 . 创建和设置UIWindow的rootViewController(根控制器)
CwlMainViewController *mainViewController = [CwlMainViewController alloc] init];
self.window.rootViewController = mainViewController; // 3 . 显示窗口
[self.window makeKeyAndVisable]; return YES;
}
// 即将失去活动状态的时候调用(失去焦点, 不可交互)
- (void)applicationWillResignActive:(UIApplication *)application
{
} // 重新获取焦点(能够和用户交互)
- (void)applicationDidBecomeActive:(UIApplication *)application
{ } // 应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// 一般在该方法中保存应用程序的数据, 以及状态
} // 应用程序即将进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// 一般在该方法中恢复应用程序的数据,以及状态
} // 应用程序即将被销毁的时候会调用该方法
- (void)applicationWillTerminate:(UIApplication *)application
{
// 注意:如果应用程序处于挂起状态的时候无法调用该方法
// 提醒是否关闭,保存重要信息等
} // 应用程序接收到内存警告的时候就会调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
// 这里是监控全局的内存警告方法,所有内存警告首先会由这里接收到,再传递到各个控制器进行处理,一般在该方法中释放掉不需要的内存
}

控制器的多种创建方式

1. 通过storyboard直接创建

2. 直接创建

CwlViewController *cwl = [[CwlViewController alloc] init];

3. 通过xib文件创建

CwlViewController *cwl = [[CwlViewController alloc] initWithNibName:@"CwlViewController" bundle:nil]];

控制器的View的多种创建方式

创建完控制器之后,会创建控制器的view,view的创建有多种情况,看下图:

需要注意的地方

1. 控制器的loadView方法优先级是最高的

2. 因为在官方文档的图片中,已经忽略xib的情况,如果storyboard没被设置,就先判断xib文件,详细效果是这样。

【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结的更多相关文章

  1. IOS程序运行过程

    IOS程序是从main开始运行的,main.m文件内容如下: #import <UIKit/UIKit.h> #import "AppDelegate.h" int m ...

  2. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  3. QF——iOS程序运行原理(APP的生命周期)

    iOS程序的运行原理: main.m: 1. main.m 主函数是所有程序的入口函数. 2. 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIAp ...

  4. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...

  5. MVC5 Controller简要创建过程(1):ControllerFactory的创建

    即将离职,闲来无事回顾下MVC的源码,到了Controller创建这里,由于流程有点复杂,鉴于自己记性不太好,索性就记录一下吧,方便日后参照. 首先看MvcHandler: public class ...

  6. java中类的加载过程和对象的创建过程

    1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...

  7. IOS 程序运行过程

    第一次写有点小紧张  希望大家多多指教! 主要讲讲程序从点击运行到结束这个过程中后面的代码都有哪些变化. 首先先了解一下UIApplication.UIApplication的核心作用是提供IOS运行 ...

  8. IOS基础开发一(ios程序运行过程)

    今天做了一个简单的仿QQ登陆UI晒一晒:

  9. UIViewController的生命周期及iOS程序运行顺序

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWit ...

随机推荐

  1. Obout - ASP.NET HTML Editor

    ASP.NET MVC HTML Editor http://www.obout.com/mvc-editor/index.aspx http://www.obout.com/index.aspx H ...

  2. 【最短路】ACdream 1198 - Transformers' Mission

    Problem Description A group of transformers whose leader is Optimus Prime(擎天柱) were assigned a missi ...

  3. JAVA网络编程常见问题

    一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...

  4. C#.net拖拽实现获得文件路径

    思路: 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等),  在DragDrop事件中对“信息”进行解析.        窗体的AllowDrop属性必须设置成tru ...

  5. 初学JSP+Servlet常见的错误

    web编程中常见的错误: 一.404(要访问的资源没有找到) 1.web程序有没有部署(将项目到tomcat中) 2.url有没有写错(包括大小写,包括项目有没有重命名) 3.有没有将jsp/html ...

  6. 【Cocos2d入门教程六】Cocos2d-x事件篇之触摸

    Cocos游戏当中产生一个事件时,可以有多个对象在监听该事件,所以有优先级(Priority).优先级越高(Priority值越小),事件响应越靠前. 关系图: 新 事件分发机制:在2.x 版本事件处 ...

  7. crackme_zapline分析

    [破文标题]crackme_zapline 分析 [破文作者]CloAk [作者邮箱]@qq.com [作者主页] [破解工具]OD,... [破解平台]Windows --------------- ...

  8. 合理使用mysql中的load data infile导入数据

    基本语法: load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]into table tbl_name ...

  9. .NET的JSNO 序列化跟反序列化

    由于本人最近在写webservice,之前一直都同通过AJAX,在服务端处理业务,但是最近需要写一些接口给其他人用,需要使用jsno的序列化与反序列化,什么是jsno就不多说,jsno的好处也不多说, ...

  10. XMPP登录应用

    一.导入框架 1.XMMP框架,写入头文件,设置XMPPStreamDelegate代理,定义 XMPPStream *_xmppStream; 2.libresolv.dylib 3.libxml2 ...